Bash脚本 – 迭代find的输出

我有一个bash脚本,我需要遍历find命令输出的每一行,但似乎是从find命令遍历每个Word(空格分隔)。 我的脚本看起来像这样到目前为止:

folders=`find -maxdepth 1 -type d` for $i in $folders do echo $i done 

我希望这会给出如下输出:

 ./dir1 and foo ./dir2 and bar ./dir3 and baz 

但我感到这样得到输出:

 ./dir1 and foo ./dir2 and bar ./dir3 and baz 

我在这里做错了什么?

Solutions Collecting From Web of "Bash脚本 – 迭代find的输出"

由于您没有使用find的更高级特性,因此您可以使用一个简单的模式遍历子目录:

 for i in ./*/; do echo "$i" done 
 folders=`foo` 

总是错误的,因为它假设你的目录不会包含空格,换行符(是的,它们是有效的!),glob字符等等。一个可靠的方法(需要GNU扩展-print0 )如下:

 while IFS='' read -r -d '' filename; do : # something with "$filename" done < <(find . -maxdepth 1 -type d -print0) 

另一种安全可靠的方法是直接调用你想要的命令:

 find . -maxdepth 1 -type d -exec printf '%s\n' '{}' + 

请参阅UsingFind wiki页面以获得对该主题的完整处理。

你可以做这样的事情:

 find -maxdepth 1 -type d | while read -ri do echo "$i" done