19

我尝试搜索可能包含我尝试使用的空格的文件-print0IFS在此处设置是我的脚本

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

它不显示任何内容。

4

2 回答 2

28

尽管丹尼斯威廉姆森的回答是绝对正确的,但它会创建一个 subshel​​l,这将阻止您在循环内设置任何变量。您可以考虑使用进程替换,如下所示:

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...)被替换为find直接返回输出的文件名(通常是管道的句柄)。因为while从文件而不是管道读取,所以您的循环可以设置可从范围外访问的变量。

于 2014-05-19T23:16:31.777 回答
27

仅在 的上下文中使用read -d '' -r file和设置:IFSread

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

并引用你的变量。

于 2012-07-06T16:34:40.857 回答