改行文字を含むファイル名を読む

改行文字を含むファイル名を読む

今、私たち全員は以下を使用しないことに精通しています。

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を使用することもできます。改行、スペース、ファイル名のワイルドカードなどを含む検索パスをサポートするためにスクリプトまたはシェル関数が必要な場合は、二重引用符拡張も必要です。readread-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 {} +

関連トピック:

おすすめ記事