find 和 md5sum 沒有產生任何輸出(find -o 限制?)
我遇到了一個我不太了解的情況。我有一堆遞歸結構的備份文件,我想計算其中的 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
第一個工作正常,第二個不產生任何輸出。我什至在沒有 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$
我還注意到要處理的第二個文件名包含標點符號、加號和非 ascii 字元。錯誤可能是由於文件命名引起的嗎?有什麼解決方法嗎?
/Esplai/+Nou/20060604 Dinar d'últim dia d'esplai[Barbacoa al torrent de l'Escaiola]/MVI_7702.AVI
首先讓我提一下 -print0 是非標準的,也不是最佳解決方案。更好的是使用“execplus”,例如
find dir -type f -exec cmd {} +
但是,您的主要問題是運算符具有優先級,並且您的 -print 僅與最後一個 -name 主要“與”。
所以正確的方法是將 -o 紅色原色放在括號中:
find dir ( -name '*.x1' -o -name '*.x2' ) -exec cmd {} +
如果需要,您當然可以添加更多 -o -type 運算符。
如果
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 個文件。您可以使用括號(用引號括起來,因為它們對 shell 也是特殊的)來更改分組:
find . -type f '(' -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" \ -o -iname "*.mp4" -o -iname "*.mpg" ')' -print0 | xargs -0 md5sum