¿Cambiar el nombre de un archivo según la etiqueta que contenga la fecha más antigua o más antigua?

Utilizo el siguiente comando para cambiar el nombre de las imágenes de forma masiva desde el interior de un script bash para que cada imagen se nombre de acuerdo con la fecha en que se tomó la imagen:

exiftool -r -f '-filename<${CreateDate}_${model;tr/ /_/}_%f.jpg' -d %Y%m%d_T%H%M%S%%-c -ext jpg $targetDir

A veces, más a menudo de lo que me gustaría, me encuentro con imágenes que tienen valores incorrectos para las fechas en los metadatos. Por ejemplo:

$ exiftool -*date -G -s  *.jpg
[File]          FileModifyDate                  : 2014:12:22 18:32:03-07:00
[File]          FileAccessDate                  : 2014:12:23 11:41:23-07:00
[File]          FileInodeChangeDate             : 2014:12:23 11:40:00-07:00
[EXIF]          CreateDate                      : 2014/12/23 00:52:41

En este ejemplo, FileModifyDate es la fecha que esperaba que estuviera en la etiqueta CreateDate, es decir, que la foto se tomó 2014:12:22 18:32:03-07:00.

Pero debido a que CreateDate no es correcto, el nuevo nombre de archivo no es correcto. Bueno, desde la perspectiva del comando usado para renombrar el archivo, es correcto (entrada de basura -> salida de basura), pero me gustaría que la fecha usada en el nombre del archivo fuera la fecha/hora en que se tomó la foto.

En este ejemplo, ¿hay alguna forma de consultar el archivo para todas las etiquetas de fecha y luego seleccionar la fecha más antigua disponible como fecha para usar en el nombre de archivo renombrado?

Además, usando '${model;tr/ /_/}' puedo reemplazar cualquier espacio que pueda estar en la etiqueta del modelo con guiones bajos. Esto está bien, pero preferiría envolver esta expresión en todo el nombre del nuevo archivo. De esa manera, dado que estoy usando '%f.jpg', si el nombre del archivo original contenía espacios, el nombre del archivo resultante no contendría espacios. ¿Es esto posible con exiftool?

Sospecho que es más probable que obtenga ayuda aquí: superuser.com/questions/tagged/exiftool
También tengo el problema de que la fecha exif está errada en una cantidad constante en todos los archivos. Puede calcular el desplazamiento y luego derivar el tiempo correcto para todo el conjunto. Después de todo, una cámara no pondrá un tiempo diferente al azar en cada toma; tendrá el reloj mal configurado.
O tal vez la zona horaria de la computadora o la cámara no está configurada correctamente
¿Cómo se mueve una pregunta de un sitio a otro sin duplicarla?

Respuestas (2)

He agregado los pasos requeridos aquí:

https://github.com/pratyushtewari/exif-scripts/blob/master/README.md

Establecido en la fecha más antigua de Exif meta o nombre de archivo

Paso 0: instala exiftool desde abajo

Instalación de ExifTool

👉 Paso 0.1

Guarde la configuración de fecha y hora más antigua en la carpeta de inicio C:\Users\YOURUSERNAMEo en su directorio de inicio ~o en la misma carpeta donde instaló exiftool. Este paso es importante para que los siguientes pasos sean exitosos. Cambiar el nombre del archivo a.ExifTool_config

Puede encontrarlos en un script aquí, pero descubrí que ejecutar los comandos en la carpeta de imágenes que mencioné en las opciones a continuación es mucho más rápido que ejecutarlos a través del script de Python exif-scripts/setToOldestDate.py Para un procesamiento más rápido, puede ejecutar estos comandos directamente en powershell desde la carpeta de imágenes que está planeando.

Si está ejecutando WSL, ejecute estos comandos desde poweshell y no WSL si el sistema de archivos lee y escribe desde la virtualización de Windows hará estallar su RAM y ralentizará el proceso hasta detenerlo.

🦺 Tenga en cuenta que estos scripts son recursivos y afectarán a todas las subcarpetas.

Bueno... ahora, elige tus opciones:

Opción 1: en caso de que necesite elegir la fecha del nombre del archivo.

Este es un analizador bastante flexible y difuso de exiftool, pero si desea que esté absolutamente seguro, puede reorganizar el archivo para incluir aaaammdd_hhmmss y eliminar todos los demás números anteriores (después está bien).

exiftool "-FileModifyDate<filename" −overwrite_original -S -m -progress -ee -q -q ./

Opción 2: establezca todas las fechas en la fecha más antigua

exiftool -overwrite_original "-FileModifyDate<OldestDateTime" "-ModifyDate<OldestDateTime" "-DateTimeOriginal<OldestDateTime" "-CreateDate<OldestDateTime" "-GPSDateTime<OldestDateTime" -S -m -progress -ee -q -q ./

Opción 3: establezca el nombre del archivo en PXL_yyyymmdd_hhmmss-[number-if-conflict].extension

exiftool "-filename<OldestDateTime" -d PXL_%Y%m%d_%H%M%S%%-c.%%e -S -m -ee -progress -q -q ./

para empujar todos los archivos en el uso del directorio actual

adb push -a . /sdcard/DCIM/Camera/

-a es para preservar los atributos.

⌛ Actualizar Android Media Store**

Como último paso, debe actualizar la base de datos de la tienda de medios de Android para que Google Photos sepa qué archivos nuevos respaldar. Actualmente no siempre detecta automáticamente, así que ¿por qué esperar eso? Instale Refresh MediaStore y ejecútelo después de que se complete la inserción de adb desde el teléfono. Luego puede abrir Google Photos y ver que se está iniciando la copia de seguridad.

¡Gracias! Un paso importante que pasé por alto es nombrar el script exif como.ExifTool_config
Oh sí. No me quedé con el nombre con un punto porque en el momento en que lo descargas, estaba oculto y la gente seguía buscándolo. jajaja. Agregaré eso en el propio archivo Léame.

Debería poder hacer algunas expresiones Perl más locas dentro de esos {}. (Estaría más tentado a escribir algo tan complejo en otro idioma, en realidad, pero por el bien del argumento):

${CreateDate; use Date::Parse; @vals = strptime($_); sprintf("%-04d_%-02d_...", $vals[5], $vals[4]);}

Nota: código completamente no probado. dudo que funcione Pero te da una dirección para empezar, si sabes perl.

+1, porque, sí, algo así. :) Y también, un indicador de lo que puede ser un mejor enfoque: enlaces gexiv2 python