Escenario
Nos encontramos ante una biblioteca de decenas de miles de archivos fotográficos, de los cuales un porcentaje considerable está corrupto.
Objetivo
Depurar las imágenes corruptas a fin de organizar como es debido nuestra biblioteca.
Solución
Nota: sólo aplicable a sistemas linux
Vamos a necesitar la aplicación
ImageMagick:
$sudo apt-get install imagemagick
y
rsync, que debería venir instalado por defecto en tu distribución linux.
Primer paso:
Identificamos los archivos corruptos y los volcamos a un fichero.
IFS=$'\n';for f in $(find /directorio/con/fotos -name '*.jpg' -or -name '*.JPG'); do identify $f > /dev/null || echo $f >> /tmp/fail ; done ; cat /tmp/fotos_corruptas
Este comando recorre de manera recursiva todos los ficheros con extensión
.jpg y, en caso encontrar uno corrupto, inserta una nueva línea en el fichero
fotos_corruptas con la ruta del fichero corrupto. Por último, muestra por pantalla el contenido de dicho fichero.
Este paso nos sirve para comprobar que, efectivamente, estamos detectando ficheros inválidos.
Segundo paso:
Movemos todos los ficheros corruptos a un directorio para su posterior borrado:
IFS=$'\n';for f in $(find /home/yolanda/Imágenes -name '*.jpg' -or -name '*.JPG'); do identify $f > /dev/null || rsync -avR $f /tmp/imagenes_corruptos ; done ; ls /tmp/imagenes_corruptas
De esta manera moveríamos todos los ficheros corruptos a la carpeta
ficheros_corruptos. El inconveniente de esta comando es que, en caso de que dos ficheros tuvieran el mismo nombre, se sobrescribirían. De ahí que sea más pertinente usar
rsync.
Versión definitiva::
IFS=$'\n';for f in $(find /home/yolanda/Imágenes -name '*.jpg' -or -name '*.JPG'); do identify $f > /dev/null || rsync -avR $f /tmp/imagenes_corruptas ; done ; ls /tmp/imagenes_corruptas
Este comando mueve todos los ficheros corruptos a
/tmp/imagenes_corruptas, respetando el árbol de ficheros.