2013-07-19 165 views
0

我遇到了一個問題,我試圖在目錄中的所有文件夾上運行命令。嵌套目錄中的Shell腳本

例如: PWD是/ home /用戶/文件 我希望我的程序/腳本通過

/home/user/Documents 
/home/user/Documents/directory1 
/home/user/Documents/directory1/foo 
/home/user/Documents/directory2 
/home/user/Documents/directory2/bar 

諸如此類的工作運行以下命令:

tranalyzer -r <file in folder> -w OUT_<name of folder> 

我也希望刪除所有沒有擴展名的文件.dmp

如果有教程有人可以指向我或幫助,他們會提供,我將不勝感激。

+0

'tranalyzer'從哪裏來? –

+0

這只是一個unix程序(http://tranalyzer.sourceforge.net/) – Hans

+1

請解釋你的意思是'OUT_ <文件夾名稱>'。你的意思是'OUT_directory1/foo'? 'directory1中/ OUT_foo'? 'OUT_directory1_foo'?還有別的嗎? –

回答

2
# iterate over a NUL-delimited stream of directory names 
while IFS='' read -r -d '' dirname; do 
    # ...then list files in each directory: 
    for file in "$dirname"/*; do 
    # ignore directory contents that are not files 
    [[ -f $file ]] || continue 
    # delete files which do not have the .dmp extension 
    if [[ $file != *.dmp ]]; then 
     rm -f "$file" 
     continue 
    fi 
    # run analysis tool 
    tranalyzer -r "$file" -w "OUT_${dirname##*/}" 
    done 
done < <(find . -type d -print0) 
+0

很優雅的答案,謝謝! – Hans

+0

試圖運行它並得到「第16行:語法錯誤:意外的文件結尾」 – Hans

+1

@HansSanft缺少嵌套循環的'done'。再試一次。 –

1

爲了使此命令起作用,您必須位於頂層目錄中,該目錄包含要緩衝的目錄。

set -f 
OIFS="$IFS" 
IFS=$'\n' 
for file in `find . -type f`; 
do 
    tranalyzer -r "$file" -w OUT_<name of folder> 
done 
IFS="$OIFS" 
set +f 
+2

如果任何文件的名稱中包含空格,就會非常非常糟糕。更糟糕的是,如果有人制造惡意文件名:想想一個名爲'out// etc/passwd/hello'的文件。 –

+1

...另請參閱http://mywiki.wooledge.org/BashPitfalls中的條目#1 –

+1

將'IFS'設置爲'$'\ n''並不能解決問題 - 首先,文件名可以合法地包含換行符(嘗試'mkdir $'foo/\ n/etc/passwd \ n/bar'' - 它工作);其次,它不關閉glob擴展,所以名爲'*'的文件將被當前目錄中的文件列表替換。 –