while read -d $'\0' file; do
found=yes
echo "Modifying $file"
chmod 755 "$file"
done < <(find /data -type f -perm 400 -print0)
if [ "x$found" != "xyes" ]; then
echo "No files found to modify"
fi
これはBash のプロセス置換機能を使用します。と同等です
find ... | while read ...
その場合を除きwhile read
、サブシェルで実行されるため、外側のシェルに表示される変数を設定することはできません。代わりに、プロセス置換を使用できます。サブシェルで<(cmd)
実行され、その標準出力は名前付きパイプにリダイレクトされます。cmd
そのパイプの名前が外部コマンドに代入されます。
次に<
、このパイプからコマンドの標準入力にリダイレクトするために使用します。while read
コマンドは、区切られた各レコードを順番に読み取り、指定された名前 (file
この場合) に値を格納します。デフォルトでread
は、改行で改行します。ほとんどのファイルでは、それで問題ありません。あなたができる:
while read file; do
...
done < <(find /data -type f -perm 400)
そしてそれはうまくいくでしょう。ただし、ファイル名に改行を含めることは技術的に可能であり、その場合は壊れます。-print0
find への引数と への-d $'\0'
引数read
により、ファイル名では無効な区切り文字としてそれぞれがヌル文字を使用します。