我有一個帶有子目錄的目錄。在目錄中,有許多從網路上爬取的圖像。
如何循環遍歷每個文件並顯示那些不是有效圖像文件的文件?
它不應該基於檔案副檔名。
我想出了這個腳本:
find . -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.png' | while read FILE; do
if ! identify "$FILE" &> /dev/null; then
echo "$FILE"
fi
done
但這不起作用,因為它也輸出有效圖像。
答案1
find . -type f \
\( -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.png' \) \
-exec sh -c '! file -b --mime-type "$1" | grep -q "^image/"' sh {} \; \
-print
我的方法用於-exec
對文件執行自訂測試。建造管道需要一個外殼。為每個具有正確副檔名的檔案執行一個單獨的 shell,因此該解決方案的效能相當差。
shell 運行file -b --mime-type
,然後grep
檢查結果是否以 開頭image/
。!
在管道的開頭否定其退出狀態,因此-exec
如果檔案不是真正的圖像,則整個測試都會成功。然後列印該路徑。
筆記:
- 省略
-name
測試以檢查所有文件。 - 或者您可能想使用
-iname
而不是-name
. -iname
但 POSIX 不要求。既不是-b
也不是--mime-type
的選項file
。以下產生的輸出略有不同,但速度更快:
find . -type f \ \( -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.png' \) \ -exec file --mime-type {} + \ | grep -v "\bimage/"
但某些檔案名稱(例如帶有換行符)或路徑(帶有
image/
)會破壞邏輯。
答案2
答案3
檢查檔案副檔名和魔術位元組很容易被欺騙。看https://unix.stackexchange.com/questions/189364/script-to-define-if-apparent-image-files-are-real-image-files/189367#189367為了獲得靈感,基本上使用 imagemagick 來檢查圖像是否有效,但即使這樣也可能被欺騙!所以沒有完美的檢查方法。