2010-11-30 66 views
2

我有一組文件夾命名爲例如10,12,13,14,18,24等等。它們不會更改任何標準增量中的數字。然後我需要重複地移動到文件夾中,然後進入下一個要執行SVN命令,其是除了一些變量擴展相同的,例如:Bash腳本迭代通過定義的文件集名稱和執行命令

/home/boy$ cp /home/files/*Session10.* . ; svn add *Session10.*; svn commit; cd ..; cd 12; 

然後下一個命令是類似:

/home/boy$ cp /home/files/*Session12.* . ; svn add *Session12.*; svn commit; cd ..; cd 14; 

所以應該定義一個數組或列表,然後通過該列表進行for循環,然後將名稱擴展後的變量輸入到cp和svn命令中。 有什麼想法?我希望它可以在命令提示符下完成,而不是在bash腳本文件中完成。

回答

1

如果列表是預定義的,並且您不遍歷每個存在的目錄(換句話說,如果存在一個名爲99的目錄,但它不在您的列表中,那麼您可以將其排除),您可以迭代列表:

list="10 12 13 14 18 24"; for dir in $list; do cd "$dir"; do_something "foo $dir bar"; done 

或數組:

array=(10 12 13 14 18 24); for idx in ${!array[@]}; do cd "${array[idx]}"; do_something "foo ${array[idx]} bar"; done 

你可以做一個或下一個數組元素是這樣的:${array[idx-1]}${array[idx+1]}如果你做相應的檢查,以確保你沒有試圖檢索元素與否定e索引(超出最後一個元素的索引將返回空值)。

或:

array=(10 12 13 14 18 24); for dir in ${array[@]}; do cd "$dir"; do_something "foo $dir bar"; done 

其基本上與上述相同的列表的例子。

1

base=$PWD; for num in *; do cd $base/$num; cp /home/files/*Session${num}.* .; svn add *Session${num}.*; svn commit; done

+0

什麼是PWD?這是早些時候設置的陣列嗎?並且在「for num in *」中,asterix會自動處理這組擴展名?謝謝 – Vass 2010-11-30 17:08:47

2

的沒有道理的方法是:

for dir in [0-9][0-9]/; do 
    cd "$dir" 
    cp /home/files/*Session${dir%/}.* . 
    svn add *Session${dir%/}.* 
    svn commit 
    cd .. 
done 

這將在其由2個位數的目錄進行迭代。

1

查找式解決方案的時間。

find . -maxdepth 1 -regextype posix-extended -type d -regex '.*/[0-9]{2}$' -exec \ 
    bash -c 'dir=${1##*/} 
    cd $1 
    cp /home/files/*Session{$dir}.* . 
    svn add *Session${dir}.* 
    svn commit' -- {} \; 

編輯:現在比以往更尋找。