Find

find 和 md5sum 沒有產生任何輸出(find -o 限制?)

  • September 11, 2015

我遇到了一個我不太了解的情況。我有一堆遞歸結構的備份文件,我想計算其中的 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

引用自:https://unix.stackexchange.com/questions/229105