web-dev-qa-db-ja.com

ファイル名に空白が含まれているBashの検索出力をループする

空白を含む可能性のあるファイルを検索しようとしています-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

何も表示されません。

19
jcubic

使用する 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

そして、変数を引用します。

26

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はパイプではなくファイルから読み取るため、ループはスコープ外からアクセス可能な変数を設定できます。

26
Jeff Bowman