![循环遍历文件并将 BMP 文件转换为 JPG](https://linux22.com/image/109738/%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E6%96%87%E4%BB%B6%E5%B9%B6%E5%B0%86%20BMP%20%E6%96%87%E4%BB%B6%E8%BD%AC%E6%8D%A2%E4%B8%BA%20JPG.png)
我有一个图像文件夹。全部都有 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