我尝试搜索可能包含空格的文件我尝试使用-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
它不会显示任何内容。
答案 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
引用你的变量。