最後に-print0を追加するとfind:s -orが失敗するのはなぜですか?

最後に-print0を追加するとfind:s -orが失敗するのはなぜですか?

私はディレクトリツリーのいくつかの映画を修正するための小さなスクリプトを書いています; bash forループやそれに似たものを使ってツリーを解析したいと思います。

だからファイルを見つけ始めました。

find -iname *.mov -or -iname *.mkv -or -iname *.avi

彼は予想どおり、各タイプのファイルをいくつか示しました。

しかし、私はこれで結果を繰り返そうとしました(一部のディレクトリ名にスペースがあるため)。

find -iname *.mov -or -iname *.mkv -or -iname *.avi -print0 | while read -d $'\0' line
do
    echo $line
done

しかし今、彼はaviファイルだけを返します!だから私が-print0を追加すると、彼は私の-orと別の-inameを無視するようです。

どうしたの?

結果を繰り返す前に、find結果をtmpfileに送信する必要がありますか?

答え1

ジョブは最後のテスト(この場合)-print0にのみ追加されます。-iname *.avi一致する項目ごとに印刷ジョブを繰り返すか、いくつかのグループ化を実行します。

find -iname '*.mov' -print0 -or -iname '*.mkv' -print0 -or -iname '*.avi' -print0

または

find \( -iname '*.mov' -or -iname '*.mkv' -or -iname '*.avi' \) -print0

そして、マンページ*で次の点に注意してください。find

もちろん、パターンを引用する必要があります。それ以外の場合、シェルはパターン内のワイルドカード文字を展開します。

findこのオプションがあれば、より簡潔な形式を使用できます。

find -iregex '.*\.\(mov\|mkv\|avi\)$' -print0

-type f(これらの拡張子を使用してディレクトリ名を指定した場合は、それを追加できます。)

関連情報