Bash 如何防止'for'循环解析空间?
我有这个命令去每个目录,一旦有了,在每个文件上运行一些命令:Bash 如何防止'for'循环解析空间?,bash,recursion,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 但是,当文件或目录的名称中有空格时,就会出现问题。我怎样
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
在
完成后
我建议将查找
与-exec
一起使用,并避免将用于
或者将
find
与-print0
一起使用,以及将空字符解释为“新行”的程序,如xargs
与-NULL
一起使用find
与-exec
一起使用,并避免对使用
或者使用find
和-print0
以及一个将空字符解释为“新行”的程序,如xargs
和--NULL
一样,简短的答案是“引用扩展”,但对于您的情况,正确的答案是
find . -type f -execdir command {} \;
简短的回答是,一如既往,“引用扩展”,但对于您的情况,正确的答案是
find . -type f -execdir command {} \;
有三种方法:
1) find -exec (see the answer from Sorpigal)
2) find ... | xargs
3) find ... | while read line ; do command "$line" ; done
第三种解决方案有一个优点:您不需要像变体(1)和(2)中那样多的叉子。当您需要处理相当多的行时,它会变得很重要 有三种方法:
1) find -exec (see the answer from Sorpigal)
2) find ... | xargs
3) find ... | while read line ; do command "$line" ; done
第三种解决方案有一个优点:您不需要像变体(1)和(2)中那样多的叉子。当您需要处理相当多的行时,它会变得很重要 通常,由于分词的原因,您不应该对$中的i执行(命令)
。这里的示例:通常情况下,您不应该对$中的i执行(命令)
用于分词原因。这里的示例:可能重复的-execdir
与这些示例不同,因为它从文件所在的目录执行命令,而您的方式需要手动添加额外的cd
。-execdir
与这些示例不同,因为它从文件所在的目录执行命令,而您的方式需要手动添加额外的cd
。