Bash 脚本 - 迭代查找的输出


我有一个 bash 脚本,我需要在其中迭代 find 命令

输出的每一行,但似乎我正在迭代 find 命令中的每个单词(空格分隔)。到目前为止,我的脚本如下所示:

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

我在这里做错了什么?

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 '%sn' '{}' +

请参阅UsingFind wiki页面,了解该主题的完整处理。

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

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

你可以做这样的事情:

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

相关内容

  • 没有找到相关文章

最新更新