Eu tenho uma pasta de imagens. Todos têm a extensão JPG, mas quando executados file
em alguns, eles voltam como bitmap, por exemplo
25818.jpg: PC bitmap, Windows 3.x format, 357 x 500 x 24
Minha pergunta é como eu percorreria todas as imagens, verificaria se é um arquivo bitmap e depois o converteria em JPG?
O comando que eu usaria em um único caso seria o seguinte, mas não tenho certeza de como faria as verificações e percorreria os arquivos
mogrify -format jpg 25818.jpg
Obrigado
Responder1
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)
funcionará, desde que sua versão das file
saídas image/x-ms-bmp
receba um arquivo BMP como argumento de file -b --mime-type
. Caso contrário, você terá que modificar o script.
Muitos usuários se contentariam com a versão mais simples
for filename in ./*.jpg; do
[[ $(file -b --mime-type "$filename") = image/x-ms-bmp ]] \
&& mogrify -format jpg "$filename"
done
que, no entanto, falharia em algumas circunstâncias: 1) se você tiver ummuitogrande número de arquivos commuitonomes longos (digamos, 30.000 nomes de arquivos de comprimento médio) 2) se seus nomes de arquivos contiverem caracteres realmente estranhos.
A primeira versão é garantida contra esses raros inconvenientes.
Responder2
Com exiftool
você poderia fazer:
exiftool -q -r -ext jpg -if '
$FileType eq "BMP" and !print "$Directory/$FileName\0"' . |
xargs -r0 mogrify -format jpg