我有一個圖像資料夾。全部都有 JPG 擴展名,但是當file
與少數幾個運行時,它們會以點陣圖形式返回,例如
25818.jpg: PC bitmap, Windows 3.x format, 357 x 500 x 24
我的問題是如何循環遍歷所有圖像,檢查它是否是點陣圖文件,然後將其轉換為 JPG?
我在單一情況下使用的命令如下,但不確定如何進行檢查和循環文件
mogrify -format jpg 25818.jpg
謝謝
答案1
while IFS='' read -rd '' filename; do
[[ $(file -b --mime-type "$filename") = image/x-ms-bmp ]] \
&& mogrify -format jpg "$filename"
done < <(LC_ALL=C find . -maxdepth 1 -name '*.jpg' -print0)
將會工作,前提是當給定 BMP 檔案作為 的參數時,您的file
輸出版本。否則,您必須修改腳本。image/x-ms-bmp
file -b --mime-type
許多用戶會選擇更簡單的版本
for filename in ./*.jpg; do
[[ $(file -b --mime-type "$filename") = image/x-ms-bmp ]] \
&& mogrify -format jpg "$filename"
done
然而,在某些情況下會失敗:1)如果您有非常大量文件非常長名稱(例如,平均長度為 30000 個檔案名稱)2) 如果您的檔案名稱包含非常奇怪的字元。
第一個版本保證不會出現這種罕見的不便。
答案2
有了exiftool
,你可以這樣做:
exiftool -q -r -ext jpg -if '
$FileType eq "BMP" and !print "$Directory/$FileName\0"' . |
xargs -r0 mogrify -format jpg