2015-07-10 67 views
2

我想讓我們bash腳本批量執行現有的包。每個執行的輸入需要兩個輸入文件。我可以使用常規名稱,也可以將每個對放在其自己的子目錄中,以確保每對都保持在一起。我有一些零碎的東西,但是沒有任何東西在兩個文件之間循環,或者進入一個子目錄,做一些事情,向上移動並重復下一個子目錄。循環輸入文件對

這將執行我想要什麼就包含對文件(每個文件對被命名爲如ABC10f.txtABC10r.txt)的單一目錄:

#!/bin/bash 
# 
f=$(ls *f.txt) 
    echo "forward -> $f" 
i=$(ls *r.txt) 
    echo "reverse -> $i"; 
/path/to/package [options] $f $i; 

通過我的主要的每個子目錄下面將循環目錄,但只執行我只有當它到達最後一個(注意:我正在測試它與helloworld.sh - 我想如果我可以得到它列出每個子目錄和回聲「你好世界」後我每次我的方式做我想做的;而是我得到一個所有子目錄,後面跟着一個「hello world」的列表):

#!/bin/bash 
# 
myCommand=/path/to/scripts/helloworld.sh 

for d in ./; do 
    find * -maxdepth 1 -type d 
    cd $d 
    echo $PWD 
    exec "$myCommand" 
done 

有點幫助把它放在一起嗎?

+2

不要試圖讓這兩個列表。獲取一個列表並將名稱轉換爲配對名稱。 –

+0

'但只執行我只有當它到達最後一個'=>你的第二個腳本中的第一個'cd $ d'是*有效的*,但後面的不是。在絕對路徑中使用'cd'或使用'cd'到子shell中的相對路徑。 –

回答

2

讓您helloworld.sh樣子:

#!/bin/bash 

for f in *f.txt; do 
    r="${f/f.txt/r.txt}" 
    echo " f: $f" 
    echo " r: $r" 
    /path/to/package [options] "$f" "$r"; 
done 

而且你的第二個sript:

#!/bin/bash 
# '*/' pattern matches all of the subdirectories in the current directory 
for d in */; do 
    # doing any actions in a subshell() 
    (cd "$d" && echo "$(pwd)" && bash /path/to/scripts/helloworld.sh) 
done 
+0

是的!這似乎是正確的方法。非常感謝。 – user5103671

+0

如果有人想知道'r =「$ {f/f.txt/r.txt}」這行代碼是什麼,它會用「f」中包含的「r.txt」替換「f.txt」變量。有關此語法的更多信息,請參閱以下內容:http://wiki.bash-hackers.org/syntax/pe#search_and_replace – user31389