Usando EXIFTool para agregar datos EXIF ​​de nombres de archivos

Usando EXIFTool para agregar datos EXIF ​​de nombres de archivos

Hay un conjunto de fotografías con marcas de tiempo en sus nombres de archivo como estas:

Photo on 3-09-12 at 9.24 PM #2.jpg

Photo on 3-09-12 at 9.24 PM #1.jpg

Photo on 3-09-12 at 8.23 PM.jpg

etc.

("3-09-12", significa "3 de septiembre de 2012" o DD-MM-AA)

Pero estas fotos no tienen ningún dato EXIF. Antes de importarlas a una colección más grande, ¿cómo canalizaría esta información exiftooly también le diría que agregue nuevas marcas de tiempo como datos EXIF, todo desde los nombres de archivo de las fotos?

Actualizar: (La ahora parte 1 de) mi pregunta sobre el análisis de nombres de archivos con DD-MM-AA y 12 horas ha sido respondida muy amablemente por @Stephane. Pero descubrí que el mismo lote de fotos contiene nombres de archivos con una variación que me había pasado por alto. Espero que tenga más sentido agregar un 'Pt. 2' en lugar de comenzar una pregunta completamente nueva.

En breve:

¿Cómo podría cambiar la brillante respuesta de @Stephane?

exiftool '-CreateDate<${FileName;use Date::Manip;
                      Date_Init("DateFormat=non-US");
                      /on (.*?at.*?[AP]M)/;$_=$1;
                      y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
                      }' ./*on\ *at*[PA]M*.jpg

- para que funcione con el formato de nombre de archivo siguiente, que es ligeramente diferente de la primera parte de la pregunta, ya que utiliza AAAA-MM-DD y hora de 24 horas:

Photo on 2010-09-15 at 18.44 #4.jpg

Photo on 2010-09-15 at 18.44 #3.jpg

Photo on 2010-09-15 at 18.44.jpg

Más explicación:

Intentar editar la Date::Manipparte del guión de Stéphane parece mostrar mi ignorancia de lo que sucede en las partes más importantes.

Intenté omitir la Date_Initlínea ya que volvemos a un formato de fecha de año completo estilo ISO y luego tenemos

/on (.*?at.*?)/;$_=$1;
y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
' ./*on\ *at*.jpg

Pero exiftoolme está dando no writeable tagsy FileName not defined. Instrucciones enhttp://search.cpan.org/~sbeck/Date-Manip-5.56/lib/Date/Manip.podno parecen ser útiles (al menos para mí) para comprender qué sucede con esos puntos, esa 'y' al comienzo de la línea, punto y coma, etc., y son bastante imposibles de buscar en Google :S

Respuesta1

Intentar:

exiftool '-CreateDate<${FileName;use Date::Manip;
                      Date_Init("DateFormat=non-US");
                      /on (.*at.*?)(?: #\d+)?\.jpg$/;$_=$1;
                      y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
                      }' ./*on\ *at*.jpg

(Es posible que tengas que instalar el Date::Manip perlmódulo).

Establece -Tag<valuela etiqueta correspondiente. Se ${tag;perl-code}puede utilizar para expandir al valor de tagdespués de que haya sido procesado por perl-code.

Aquí, el plan es utilizar Date::Manipla UnixDatefunción para analizar la fecha en el nombre del archivo y convertirla a un formato aceptable para la CreateDateetiqueta ( 2011-04-15 21:38:00).

Date::Manipentiende muchos formatos de fecha comunes. Por ejemplo, entiende 3-09-12 at 9:24 PM(aunque debe indicar si se trata de la convención de EE. UU. o de fuera de EE. UU. donde el día o el mes es el primero) y 2010-09-15 at 18.44(tenga en cuenta en :lugar de .).

Entonces, lo que hacemos es extraer esa parte del nombre del archivo, convertirlo .a :y pasarlo a UnixDate.

información relacionada