とても理解できない状況に直面しました。再帰的に構造化されたバックアップファイルが複数あり、そのうちmd5を計算しようとしています。追加のファイル拡張子を追加すると、出力は生成されず、プロセスは終了します(終了コード0)。
find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -print0 | xargs -0 md5sum
find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -o -iname "*.mpg" -print0 | xargs -0 md5sum
最初のものはうまくいきますが、2番目のものは出力を生成しません。 mpgファイルがないディレクトリでも試してみましたが、同じ動作でした。
検索するパラメータの数に制限はありますか?私はOSXを実行しており、Macportsからmd5sumをインストールしました。
追加情報
パイプに何か奇妙なことがあるようです。ファイル名のせいだと思いたいです。他のフォルダをさらに調査した結果、findコマンドが機能しているようで、129のビデオファイルがあり、そのうちの1つは.mpgでした。 find + md5sumを試みると、ファイルは1つだけ返されます。画像のみを含む別のフォルダで同様のコマンドを実行しましたが、正常に動作しました(80,000個のファイルが見つかり、80,000個のハッシュが生成されます)。
Pictures@2006$ find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" | wc -l
128
Pictures@2006$ find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -o -iname "*.mpg" | wc -l
129
Pictures@2006$ find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -o -iname "*.mpg" -print0 | xargs -0 md5sum
c21a78f2b2d5ca773b47647315ad91f8 ./pending photos/Video [%]/P007.MPG
Pictures@2006$
また、処理中の2番目のファイル名に句読点、プラス記号、および非ASCII文字が含まれていることも確認しました。ファイル名のためにエラーが発生した可能性がありますか?解決策はありますか?
/Esplai/+Nou/20060604 Dinar d'últim dia d'esplai[Barbacoa al torrent de l'Escaiola]/MVI_7702.AVI
答え1
コマンドの演算子式がfind
使用されていない場合-o
(または)または-a
(そして-a
)、それらの間に暗黙の関係があります。そしてそれより-a
も密接に結合されている。-o
find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" \
-o -iname "*.mp4" -o -iname "*.mpg" -print0
次のように解析されます。
find . '(' -type f -a -iname "*.3gp" ')' -o -iname "*.avi" -o -iname "*.mov" \
-o -iname "*.mp4" -o '(' -iname "*.mpg" -a -print0 ')'
したがって、-print0
一致するファイル(およびディレクトリ!)のみが印刷されます*.mpg
。そのため、このコマンドを使用すると、予想される129ファイルではなく1つのファイルのみが処理されます。
括弧(シェルにも特別なので引用符で囲む)を使用してグループ化を変更できます。
find . -type f '(' -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" \
-o -iname "*.mp4" -o -iname "*.mpg" ')' -print0 | xargs -0 md5sum
答え2
最初に言及する必要があるのは、print0が非標準であり、最良の解決策ではないということです。より良い方法は、「execplus」を使用することです。
find dir -type f -exec cmd {} +
しかし、主な問題は、演算子が優先順位を持ち、-print は姓 major とのみ AND で連結されることです。
したがって、正しい方法は -o 赤の基本色を括弧内に入れることです。
find dir ( -name '*.x1' -o -name '*.x2' ) -exec cmd {} +
もちろん、必要に応じて-o -type演算子を追加できます。
答え3
"*.mpg"
現在のディレクトリには、ワイルドカードと一致し、find
そのように混乱するように拡張されるファイルがあるようです。二重引用符の代わりに一重引用... -o iname A Movie about Birds.mpg
符を使用すると、ワイルドカード拡張は行われません。 '*.mpg'
"*.mpg"
find
*.mpg
何が起こっているのかを見るには、始めにecho
(echo find ...
)を追加するか、結果を| tr "\000" "\n"