Bash脚本 - 迭代find的输出

时间:2014-02-09 18:28:07

标签: linux bash shell scripting

我有一个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

我在这里做错了什么?

3 个答案:

答案 0 :(得分:16)

folders=`foo`

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

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

另一种安全可靠的方法是让find本身直接调用您想要的命令:

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

有关该主题的完整处理,请参阅UsingFind维基页面。

答案 1 :(得分:5)

由于您没有使用find的任何更高级功能,因此可以使用简单模式迭代子目录:

for i in ./*/; do
    echo "$i"
done

答案 2 :(得分:3)

您可以这样做:

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