1

我有这个命令去每个目录,一旦有对每个文件运行一些命令:

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

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

当试图对这个问题应用答案时,就会出现这种疑问

编辑:这个评论 中也出现了一个很好的解决方案。要解决空格问题,请添加

IFS=$'\n'

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

unset IFS

之后done

4

3 回答 3

4

与往常一样,简短的答案是“引用扩展”,但对于您的情况,正确的答案是

find . -type f -execdir command {} \; 
于 2012-06-15T16:08:13.287 回答
3

有以下三种方式:

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

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

于 2012-06-15T16:57:58.180 回答
2

我建议使用findwith-exec并避免使用for.

或者使用findwith-print0和一个将 NULL 字符解释为“新行”的程序,例如xargswith--null

于 2012-06-15T16:02:00.883 回答