findとmd5sumは出力を生成しません(find -olimit?)。

findとmd5sumは出力を生成しません(find -olimit?)。

とても理解できない状況に直面しました。再帰的に構造化されたバックアップファイルが複数あり、そのうち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

何が起こっているのかを見るには、始めにechoecho find ...)を追加するか、結果を| tr "\000" "\n"

関連情報