如何对名称中带空格的文件执行shell“for”命令?

时间:2010-02-16 12:32:46

标签: bash command-line shell find

我发现自己经常做以下事情:

for f in `find -foo -bar -baz`; do
  process "$f"
done

这当然不适用于带空格的文件名。我该如何处理这类案件?

5 个答案:

答案 0 :(得分:4)

Find和xargs一起工作得很好。 find可以使用\0 - 分隔符(选项print0)打印文件的名称,xargs可以以该格式读取它们(选项-0):

find . -type f -print0 | xargs -0 echo

答案 1 :(得分:2)

find . -type f | while read file; do 
     process "$f"
done;

答案 2 :(得分:1)

如果您已经使用了find,为什么不简单地使用exec

find -foo -bar -baz -exec process '{}' \;

替代解决方案是更改IFS变量(场间分离器)

答案 3 :(得分:1)

bash 4

shopt -s globstar
for file in /path/**
do
  process "$file"
done

答案 4 :(得分:0)

在这种情况下,我的方法是在for命令之前构建列表,并将元素名称中的空格替换为不太可能出现的另一个字符或字符串。

然后在循环中,我用空格替换那个特定的字符串。

一个例子:

list=`find -foo -bar -baz | tr ' ' 'µ'`
for fx in $list ; do
    f=`echo $fx | tr 'µ' ' '`
    process "$f"
done