簡體   English   中英

循環遍歷目錄

[英]Looping through directories

我有一個類似的目錄結構,我循環遍歷目錄,但得到錯誤無法找到目錄任何想法? 在第一個目錄中它正在尋找dir1 dir2 dir3等等,在第二個dir1中它正在尋找dirA dir B和dirC謝謝。

   ./subtle1/
        /fooA/file.txt
        /fooB/file.txt
        /fooC/file.txt

   ./subtle2/
     /fooA/file.txt
     /fooB/file.txt
     /fooC/file.txt

for i in ~/new/subtle*;
       do
               if [ -d "$i" ] ; 
then
       cd $i

    for j in "$i"/foo* ; do

                if [ -d "$j" ] ; 
 then
       cd $j
            mv file.txt $i.$j.file.txt
 done
 done

立即引起我注意的一個問題是你在一個循環中進行cd ,並且你沒有從該目錄中出來進行下一次迭代。

所以,你cd~/new/subtle1/fooA ,做一些工作,然后你在那個目錄里已經下一次迭代,而你想在你原來的(起始)點。

我會看看pushd / popd pushd就像cd一樣工作,但是它維護着一堆被訪問的目錄,而popd會把你帶回到那個堆棧中。

例如

$ pwd
/home/brian

$ pushd /var/log
$ pwd
/var/log

$ popd
$ pwd
/home/brian

如果您只想以這種方式更改文件名:

mv ./subtle1/fooB/file.txt ./subtle1/fooB/subtle1.fooB.file.txt
mv ./subtle1/fooA/file.txt ./subtle1/fooA/subtle1.fooA.file.txt
mv ./subtle1/fooC/file.txt ./subtle1/fooC/subtle1.fooC.file.txt
mv ./subtle2/fooB/file.txt ./subtle2/fooB/subtle2.fooB.file.txt
mv ./subtle2/fooA/file.txt ./subtle2/fooA/subtle2.fooA.file.txt
mv ./subtle2/fooC/file.txt ./subtle2/fooC/subtle2.fooC.file.txt

比你所需要的只是:

find -type f -print|sed -r -e 's/\.\/(.+)\/(.+)\/(.+)/\0 .\/\1\/\2\/\1.\2.\3/'|xargs -n 2 mv

如果您真的想通過腳本執行此操作並使用cd來四處走動,請嘗試以下操作:

#!/bin/bash

for sub in subtle*; do
  if [ -d "${sub}" ]; then
    cd ${sub}
    for foo in foo*; do
      if [ -d "${foo}" ]; then
        cd ${foo}
        pwd
        echo mv -- file.txt ${sub}.${foo}.file.txt
        cd ..
      fi
    done
    cd ..
  fi
done 

你可以刪除pwdecho來執行mv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM