
Tengo una carpeta de imágenes. Todos tienen la extensión JPG, pero cuando se comparan file
con 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 file
resultados image/x-ms-bmp
cuando 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