Перебирать файлы и конвертировать файлы BMP в JPG

Перебирать файлы и конвертировать файлы BMP в JPG

У меня есть папка с изображениями. Все они имеют расширение JPG, но при запуске fileнекоторых из них они возвращаются как bitmap, например

25818.jpg: PC bitmap, Windows 3.x format, 357 x 500 x 24

У меня вопрос: как мне перебрать все изображения, проверить, является ли это файлом bitmap, а затем преобразовать его в 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)

будет работать, при условии, что ваша версия fileвыводит данные image/x-ms-bmpпри указании файла 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

Связанный контент