今、私たち全員は以下を使用しないことに精通しています。
find . -print | xargs cmd
しかし、使用
find . -print0 | xargs -0 cmd
たとえば、改行を含むファイル名を処理するには、私のスクリプトの行はどうですか?
find $@ -type f -print | while read filename
まあ、私はこれが次のようになると思いました。
find $@ -type f -print0 | while read -d"\0" filename
私がこうすれば:
find $@ -type f -print0 | while read filename
NULLが表示されますか?
しかし、whileループは0回の反復後に終了します。(両方の場合)読み取りが0を返し、NULL(\ 0)が読み取りのためであるとします。
乱交のような感じだ読む運動しなければならない「-0」オプション。
私が何が起こっているのか誤って読んでいるのでしょうか、それとも別の方法でフレームを整理できますか?
この例では、xargsを使用するために再コーディングする必要があるかもしれませんが、これはフォークしたくない新しいプロセスです。
答え1
を使用すると、次のヌル文字を読み取るためにのみread
使用できます。-d ''
組み込みユーティリティbash
についてのマニュアルから:read
-d delim
の最初の文字は、delim
改行文字ではなく入力行を終了するために使用されます。delim
空の文字列の場合、NULread
文字を読み取ると行が終了します。
また、データの横の空白をIFS
切り捨てるために空の文字列に設定し、バックスラッシュを含む文字列を正しく読み取るためにwithを使用することもできます。改行、スペース、ファイル名のワイルドカードなどを含む検索パスをサポートするためにスクリプトまたはシェル関数が必要な場合は、二重引用符拡張も必要です。read
read
-r
$@
find "$@" -type f -print0 |
while IFS= read -r -d '' pathname; do
# use "$pathname" to do something
done
find
個人的に緊急に必要でない場合は、パス名をまったく渡さずに必要な操作を実行してください-exec
。
find "$@" -type f -exec sh -c '
for pathname do
# use "$pathname" to do something
done' sh {} +
関連トピック: