空白を含む可能性のあるファイルを検索しようとしています-print0
and set 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
何も表示されません。
使用する 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
そして、変数を引用します。
Dennis Williamsonの答え は絶対に正しいですが、 サブシェルを作成します であるため、ループ内で変数を設定できなくなります。次のように、プロセス置換の使用を検討できます。
_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
はパイプではなくファイルから読み取るため、ループはスコープ外からアクセス可能な変数を設定できます。