循环查找Bash中的输出,其中文件名包含空格

时间:2012-07-06 16:30:21

标签: bash find while-loop

我尝试搜索可能包含空格的文件我尝试使用-print0并设置IFS这是我的脚本

IFS=$'\0';find people -name '*.svg' -print0 | while read file; do
    grep '<image' $file > /dev/null && echo $file | tee -a embeded_images.txt;
done

我尝试对包含嵌入图像的所有svg文件进行处理,它在没有-print0的情况下工作但是一个文件失败,所以我停止了脚本。这是一个更简单的例子,也不起作用

IFS=$'\0';find . -print0 | while read file; do echo $file; done

它不会显示任何内容。

2 个答案:

答案 0 :(得分:26)

虽然Dennis Williamson's answer绝对正确,但creates a subshell会阻止您在循环中设置任何变量。您可以考虑使用流程替换,如下所示:

while IFS= read -d '' -r file; do
    grep '<image' "$file" > /dev/null && echo "$file" | tee -a embeded_images.txt
done < <(find people -name '*.svg' -print0)

第一个<表示您正在从文件中读取,并且<(find...)被文件名(通常是管道句柄)替换,该文件名返回{{1}的输出直接。因为find从文件而不是管道读取,所以您的循环可以设置可从范围外部访问的变量。

答案 1 :(得分:25)

使用read -d '' -r file并仅为IFS的上下文设置read

find people -name '*.svg' -print0 | while IFS= read -d '' -r file; do
    grep '<image' "$file" > /dev/null && echo "$file" | tee -a embeded_images.txt;
done

引用你的变量。