私はディレクトリツリーのいくつかの映画を修正するための小さなスクリプトを書いています; 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
(これらの拡張子を使用してディレクトリ名を指定した場合は、それを追加できます。)