循环遍历文件并将 BMP 文件转换为 JPG

循环遍历文件并将 BMP 文件转换为 JPG

我有一个图像文件夹。全部都有 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-bmpfile -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

相关内容