2013-07-19 194 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扩展,所以名为'*'的文件将被当前目录中的文件列表替换。 –