A menudo importo fotos y videos (principalmente con extensiones JPG y MOV) de cámaras digitales y tabletas a mi PC, e idealmente me gustaría verlos ordenados según las fechas y horas en que fueron tomados ya presente en sus datos EXIF. Y de ahí mi deseo de renombrarlos a todos preferiblemente usando un simple Nautilus Script preferiblemente insertando las marcas de fecha y hora antes de cada nombre de archivo.
Hasta ahora solo he logrado reunir el siguiente Nautilus Script, que creo que está lejos de ser perfecto:
for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i""
done
Lo que no me gusta de este método de cambio de nombre son los dos puntos usados en las marcas de fecha y hora EXIF (p. ej., “2013:09:03 20:55:09_IMG_0108.JPG”), lo que podría generar problemas al transferir estos archivos posteriormente a otros entornos (p. ej., Windows).
Este comando (usando exiv2 en lugar de exiftool ) permite convenientemente la manipulación de marcas de fecha y hora, pero su inconveniente es que no funciona en archivos de video (por ejemplo, MOV) :
exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"
Así que espero que alguien pueda encontrar una solución mejor. ¡Y sería mágico si incluso lograra convertir los nombres de archivo originales y las extensiones a minúsculas también!
Respuesta aceptada:
Lo que no me gusta de este método de cambio de nombre son los dos puntos que se utilizan en las marcas de fecha y hora EXIF (p. ej., "2013:09:03 20:55:09_IMG_0108.JPG"), que pueden crear problemas al transferir estos archivos más adelante a otros entornos ( por ejemplo, Windows).
Puede ejecutar el esquema de nombres a través de sed
, para reemplazar los dos puntos con guiones y los espacios con guiones bajos, así:
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"
En cuanto a poner todo en minúsculas, podría usar rename
:
rename 's/(.*)/\L$1/' file.JPG
## or
rename 's/(.*)/\L$1/' *.*
O podría hacerlo dentro de su script usando sed
, como en:
j=$(echo "$i" | sed -e 's/\(.*\)/\L\1/')
…y luego usa el $j
variable en lugar del $i
final de tu mv
línea. Esta forma de sed es un poco más portátil (si eso te importa) ya que las diferentes distribuciones de Linux tienen diferentes comandos de cambio de nombre, mientras que sed es universal.
O, alternativamente, la secuencia de comandos se puede modificar de la siguiente manera para realizar la conversión de nombre de archivo a minúsculas al principio usando tr
en cambio:
for arg
do
tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done
Para ejecutar comandos ligeramente diferentes para diferentes tipos de archivos, se puede usar una declaración de caso bash en este script. Por ejemplo:
#! /usr/bin/env bash
for filename in ./*
do
tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')"
case "$filename" in
*.MOV|*.mov)
mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print $2}' | sed -e 's/\-[0-9][0-9]\:00//g' -e 's/\+[0-9][0-9]\:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp"
;;
*.JPG|*.jpg)
mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
;;
*)
echo 'Not a *.jpg or a *.mov!'
;;
esac
done
En este ejemplo, el cambio de nombre de los archivos MOV que tienen marcas de tiempo CreateDate CUALQUIER NÚMERO de horas DESPUÉS O ANTES de los archivos JPG se ajusta utilizando otros datos EXIF (-tur) y eliminando ese sufijo de diferencia horaria, y podría ser necesario cambiar -tur parte de acuerdo con la ubicación establecida en el sistema.