如何防止`for`循环解析空格?

时间:2012-06-15 15:50:16

标签: bash recursion

我有这个命令转到每个目录,一旦在每个文件上运行一些命令:

STDIR=$PWD;
for dir in $(find . -type d 2>&-); do 
    cd "$dir";
    for file in $(find * -prune -type f 2>&-); do 
        command "$file";
    done; 
    cd "$STDIR"; 
done

但是当文件或目录在名称中有空格时会出现问题。我该如何解决这个问题?

尝试将答案应用于this question时会出现此疑问。

修改 一个好的解决方案也出现在this comment中。要解决空间问题,请添加

IFS=$'\n'

在上面代码的第一行之后,

unset IFS

done之后。

3 个答案:

答案 0 :(得分:4)

简短的回答是,一如既往地“引用扩展”,但对于您的情况,正确的答案是

find . -type f -execdir command {} \; 

答案 1 :(得分:3)

有三种方式:

1) find -exec (see the answer from Sorpigal)
2) find ... | xargs
3) find ... | while read line ; do command "$line" ; done

第三种解决方案有一个优点:您不需要变体(1)和(2)中那么多的叉子。当你需要处理很多行时,它就变得很重要。

答案 2 :(得分:2)

我建议将find-exec一起使用,并避免使用for

或者使用find-print0以及将NULL字符解释为“新行”的程序,例如xargs--null