19

使用しようとしている空白が含まれている可能性のあるファイルを検索しようとしています。ここ-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がなくても機能しますが、1つのファイルが失敗するため、スクリプトを停止します。これも機能しない簡単な例です

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

何も表示されません。

4

2 に答える 2

28

Dennis Williamson の答えは完全に正しいですが、 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 に答える