Faz loop através de arquivos e converte arquivos BMP em JPG

3

Eu tenho uma pasta de imagens. Todos têm a extensão JPG, mas ao executar file contra alguns, eles retornam como bitmap, por exemplo.

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

A minha pergunta é como eu iria percorrer todas as imagens, verificar se é um arquivo de bitmap e depois convertê-lo para um JPG?

O comando que eu usaria em um único caso seria o seguinte, mas não tenho certeza de como eu faria as verificações e passaria pelos arquivos

mogrify -format jpg 25818.jpg

Obrigado

    
por pee2pee 17.04.2017 / 22:09

2 respostas

4

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 de file produza image/x-ms-bmp quando receber um arquivo BMP como argumento de file -b --mime-type . Caso contrário, você precisa 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ê tem um muito grande número de arquivos com nomes longos muito (digamos, 30000 nomes de arquivos de tamanho médio ) 2) se seus nomes de arquivos contiverem caracteres realmente estranhos.

A primeira versão é garantida contra essas inconveniências raras.

    
por 17.04.2017 / 22:30
2

Com exiftool , você poderia fazer:

exiftool -q -r -ext jpg -if '
  $FileType eq "BMP" and !print "$Directory/$FileName
exiftool -q -r -ext jpg -if '
  $FileType eq "BMP" and !print "$Directory/$FileName%pre%"' . |
  xargs -r0 mogrify -format jpg
"' . | xargs -r0 mogrify -format jpg
    
por 30.08.2017 / 23:41

Tags