web-dev-qa-db-ja.com

findとmd5sumが出力を生成しない(find -o limit?)

よくわからない状況に遭遇しました。 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つのファイルの後に返されます。写真のみを含む他のフォルダーで同様のコマンドを実行しましたが、正常に機能しました(80kのファイルが見つかり、80kのハッシュが生成されました)。

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
2
Josep Valls

最初に、-print0は非標準であり、最善の解決策ではないことを述べておきます。 「execplus」を使用することをお勧めします。

_find dir -type f -exec cmd {} +_

ただし、主な問題は、演算子が優先され、-printが姓のプライマリのみで「anded」されることです。

したがって、正しい方法は、-oの赤いプライマリを括弧で囲むことです。

find dir ( -name '*.x1' -o -name '*.x2' ) -exec cmd {} +

もちろん、必要に応じて-o型の演算子を追加することもできます。

1
schily

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
4
Mark Plotnick

現在のディレクトリに"*.mpg"ワイルドカードと一致するファイルがあり、findを混乱させるものに展開されていると思います。 ... -o iname A Movie about Birds.mpg。一重引用符を使用する場合、例: '*.mpg'は二重引用符"*.mpg"ではなく、ワイルドカード展開は行われず、findには*.mpgが表示されます。

何が起こっているかを確認するには、先頭にechoを置くか(echo find ...)、結果を| tr "\000" "\n"にパイプします。

0
waltinator