У меня есть папка с изображениями. Все они имеют расширение 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