Percorra arquivos e converta arquivos BMP em JPG

Percorra arquivos e converta arquivos BMP em JPG

Eu tenho uma pasta de imagens. Todos têm a extensão JPG, mas quando executados fileem 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 filesaídas image/x-ms-bmpreceba 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 exiftoolvocê poderia fazer:

exiftool -q -r -ext jpg -if '
  $FileType eq "BMP" and !print "$Directory/$FileName\0"' . |
  xargs -r0 mogrify -format jpg

informação relacionada