我有这个命令转到每个目录,一旦在每个文件上运行一些命令:
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
之后。
答案 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