Añadir nuevo comentario

Organizando fotos con awk

Cuando volvemos de vacaciones nos encontramos con la cámara de fotos a reventar y en mi caso como la tarjeta SD no me llegaba y soy un paranóico de los backups, he ido haciendo copias de seguridad diarias en el portátil y cuando la tarjeta de 1 GB se llenaba la vaciaba en el portátil.
Como tampoco hay mucho tiempo para hacer la copia porque se supone que estás de vacaciones y tienes mejores cosas que hacer tampoco te preocupas en ordenarlo todo.

El resultado han sido casi 2000 fotografías por quintuplicado en mi disco duro y otras cuantas en la cámara de fotos en directorios con nombres extremadamente descriptivos como F1, Fotos, fotos, f2, f3, ...

Poniendo orden al desorden
Mi intención es tener las fotos organizadas por día, una en cada carpeta con un nombre algo más descriptivo que IMG_1234.JPG.

Las fotos realizadas por cualquier cámara digital moderna incluyen datos EXIF. Esos datos EXIF son por ejemplo datos de la cámara con que se tiró la foto, la orientación vertical u horizontal de la foto, formato, tiempo de obturación ... y por supuesto la fecha en que se sacó.

Vamos a utilizar la fecha para renombrar las fotos a algo más descriptivo. El nuevo nombre será AAAAMMDDhhmmss-IMG_1234.JPG . De esta forma podremos saber de cuando es cada foto para ordenarlas un poco.

El primer paso es sencillo: copiar todas las fotos a un solo directorio.

El segundo paso consiste en escribir un sencillo programilla que extraiga la fecha de la foto y haga el renombrado.
Empezamos como siempre con un apt-cache search exif y vemos que hay un paquete que se llama exif que nos devuelve todos los datos exif en formato texto.
Pensé en hacerlo en perl o en python pero ¿porque no cut y awk?
Después de 20 minutillos ya tenía la solución (agárrate a la silla):
for i in `ls *IMG*`; do
mv $i `exif $i | grep "Fecha y Hora (origin" | cut -d\| -f2 | awk 'BEGIN {FS=":";RS=" ";tojunto=""} 1 {tojunto=$1 $2 $3;print tojunto}' | awk 'BEGIN {tojunto=""} 1 {tojunto=tojunto $1} END {print tojunto}'`-$i
done

With English environment vars:

for i in `ls *IMG*`; do
mv $i `exif $i | grep "Date and Time (origi" | cut -d\| -f2 | awk 'BEGIN {FS=":";RS=" ";tojunto=""} 1 {tojunto=$1 $2 $3;print tojunto}' | awk 'BEGIN {tojunto=""} 1 {tojunto=tojunto $1} END {print tojunto}'`-$i
done

Y para ordenar los vídeos siguiendo el mismo criterio utilizamos las previsualizaciones que genera la cámara:

for i in `ls *THM*`; do
name=`echo $i | awk 'BEGIN {FS="."}{print $1}'`
fecha=`exif $i | grep "Fecha y Hora (origin" | cut -d\| -f2 | awk 'BEGIN {FS=":";RS=" ";tojunto=""} 1 {tojunto=$1 $2 $3;print tojunto}' | awk 'BEGIN {tojunto=""} 1 {tojunto=tojunto $1} END {print tojunto}'`
mv $i $fecha-$i
mv $name.AVI $fecha-$name.AVI
done

With English environment vars:

for i in `ls *THM*`; do
name=`echo $i | awk 'BEGIN {FS="."}{print $1}'`
fecha=`exif $i | grep "Date and Time (origi" | cut -d\| -f2 | awk 'BEGIN {FS=":";RS=" ";tojunto=""} 1 {tojunto=$1 $2 $3;print tojunto}' | awk 'BEGIN {tojunto=""} 1 {tojunto=tojunto $1} END {print tojunto}'`
mv $i $fecha-$i
mv $name.AVI $fecha-$name.AVI
done

Si hubiéramos querido ordenar los ficheros por fecha de modificación:

for i in *; do
fecha=`ls -l $i | awk '{print $6}' | awk 'BEGIN {FS="-"} {print $1$2$3}'`
hora=`ls -l $i | awk '{print $7}' | awk 'BEGIN {FS=":"} {print $1$2}'`
mv $i $fecha$hora-$i
done

Al final nos quedan las fotos renombradas tal y como yo quiero:

El tercer paso se puede hacer a mano o con un script cutre. Dado que son 15 días (15 directorios) y estoy en modo vago creo que haré otro script que cree los 15 directorios y mueva las fotos a donde corresponda.
Usaremos:
for i in `ls | cut -c 1-8 | sort | uniq`; do
mkdir $i
mv $i* $i
done
.

Y listo; ya tenemos las fotos clasificadas.