Recorre archivos y convierte archivos BMP a JPG

Recorre archivos y convierte archivos BMP a JPG

Tengo una carpeta de imágenes. Todos tienen la extensión JPG, pero cuando se comparan filecon algunos, vuelven como mapa de bits, por ejemplo.

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

Mi pregunta es ¿cómo puedo recorrer todas las imágenes, verificar si es un archivo de mapa de bits y luego convertirlo a JPG?

El comando que usaría en un solo caso sería el siguiente, pero no estoy seguro de cómo haría las comprobaciones y recorrería los archivos.

mogrify -format jpg 25818.jpg

Gracias

Respuesta1

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á, siempre que su versión de fileresultados image/x-ms-bmpcuando se le proporcione un archivo BMP como argumento de file -b --mime-type. De lo contrario, deberá modificar el script.

Muchos usuarios se conformarían con la versión más sencilla.

for filename in ./*.jpg; do 
  [[ $(file -b --mime-type "$filename") = image/x-ms-bmp ]] \
      && mogrify -format jpg "$filename"
done

que, sin embargo, fallaría en algunas circunstancias: 1) si tiene unmuygran cantidad de archivos conmuynombres largos (digamos, 30000 nombres de archivos de longitud promedio) 2) si sus nombres de archivos contienen caracteres realmente extraños.

La primera versión está garantizada contra inconvenientes tan raros.

Respuesta2

Con exiftool, podrías hacer:

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

información relacionada