¿Cómo cambiar el nombre de varias fotos y videos basados ​​en datos EXIF?

11

A menudo importo fotos y videos (en su mayoría con extensiones JPG y MOV) de cámaras digitales y tabletas a mi PC, y me gustaría verlos ordenados según las fechas y horas en que se tomaron ya presentes en sus datos EXIF. Y, por lo tanto, deseo cambiarles el nombre a todos, preferiblemente usando una secuencia de comandos simple de Nautilus insertando preferiblemente 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 en este método de cambio de nombre son los dos puntos utilizados en las marcas de fecha y hora EXIF (por ejemplo, "2013: 09: 03 20: 55: 09_IMG_0108.JPG") que pueden crear problemas al transferir estos archivos más tarde a otros entornos ( por ejemplo, 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 mejor solución. ¡Y sería mágico si incluso lograra convertir los nombres de archivo originales y las extensiones a minúsculas también!

Sadi
fuente
Además de las excelentes respuestas a continuación, también debe consultar pyRenamer . No tengo experiencia en usarlo con archivos de video (¿tienen datos EXIF?) Pero puedo decir que es excelente para fotos. También puede cambiar las extensiones de archivo a minúsculas.
Tom Brossman

Respuestas:

6

Lo que no me gusta en este método de cambio de nombre son los dos puntos utilizados en las marcas de fecha y hora EXIF ​​(por ejemplo, "2013: 09: 03 20: 55: 09_IMG_0108.JPG") que pueden crear problemas al transferir estos archivos más tarde a otros entornos ( por ejemplo, Windows).

Puede ejecutar el esquema de nomenclatura sedpara reemplazar los dos puntos con guiones y espacios con guiones bajos, de esta manera:

mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"

En cuanto a hacer todo en minúsculas, puede usar rename:

rename 's/(.*)/\L$1/' file.JPG
##  or
rename 's/(.*)/\L$1/' *.*

O puede hacerlo dentro de su script usando sed, como en:

j=$(echo "$i" | sed -e 's/\(.*\)/\L\1/')

... y luego usa la $jvariable en lugar del final $ide tu mvlínea. Esta forma de sed es un poco más portátil (si eso es importante para usted) ya que las diferentes distribuciones de Linux tienen diferentes comandos de cambio de nombre, mientras que sed es universal.

O, alternativamente, el script se puede modificar de la siguiente manera para realizar la conversión de nombre de archivo a minúsculas al principio usando en su trlugar:

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 según la ubicación establecida en el sistema.

maldad
fuente
Desafortunadamente, no pude encontrar la forma de convertir nombres de archivo a minúsculas como sugiere (insertar esa línea arriba y cambiar el último $ipara $jque no haya hecho nada). En cambio, inserté la conversión de nombre de archivo a minúsculas al principio y me tomé la libertad de agregar esto como otra opción (que funcionó al menos para mí) al final de su respuesta para que pueda aceptar su respuesta. Por supuesto, puede editar su respuesta más como lo desee.
Sadi
@sadi mirándolo con ojos nuevos, puedo ver lo que estaba haciendo mal con el comando sed. La última versión funcionará, aunque, por supuesto, si el método tr funciona bien para usted (tengo la sospecha de que la solución tr podría ser un poco más eficiente en realidad, aunque el sed manejará mejor los caracteres que no están en inglés)
evilsoup
Gracias. Me pregunto si también puede ayudarme a mejorar aún más este script utilizando un comando para archivos MOV y otro para otros en la misma línea: if [la extensión es MOV] bla, bla; De lo contrario, bla, bla. La razón es que me acabo de dar cuenta de que el sello "CreateDate" en mis archivos MOV (desde iPad) tiene extrañamente +4 horas y necesito usar otra opción (CreateDate-tur) para que logren un orden preciso de fotos y videos .
Sadi
La mejor manera de hacerlo (en mi opinión) es usar una declaración de caso; Aquí hay algo para comenzar. También puede usar una declaración if, pero las declaraciones de casos se pueden expandir más fácilmente para obtener extensiones de archivo adicionales. Busque en Internet la "declaración de caso bash" para obtener más información.
evilsoup
¡¡¡Un millón de gracias!!! También agregaré esta opción a la respuesta, si no le importa.
Sadi
13

Necesitaba cambiar el nombre de mis fotos y encontré esta pregunta aquí; acabo de descubrir que lo exiftoolmaneja de forma nativa:

De http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html

exiftool -d %Y-%m-%d_%H-%M-%S%%-c.%%e "-filename<CreateDate" DIR 

Si desea realizar un seguimiento del nombre de archivo original y escribir minúscula de extensión:

exiftool -d %Y%m%d_%H%M%S%%-c-%%f.%%le "-filename<DateTimeOriginal" [.|DIR]

Lo mismo funciona también con todo el nombre de archivo en minúsculas:

exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]
DerekC
fuente
DIR debe ser la carpeta donde se asignan las fotos. Si ya hemos abierto una Terminal en la Carpeta donde queremos ejecutar el Comando, tenemos que reemplazar DIR por. Y si desea agregar un Prefijo, al Nombre de archivo (es decir, IMG_), debe insertarse antes de la cadena de fecha sin ninguna comilla. Aquí un ejemplo: exiftool -d IMG_% Y% m% d_% H% M% S %% - c. %% e "-filename <CreateDate".
Nothor
2

Sé que dijiste que preferías un script, sin embargo, si estás abierto a una aplicación Java gratuita puedes usar AmoK Exif Sorter

ingrese la descripción de la imagen aquí

óptico
fuente
1

Lo usaría krenamepara esto. Eso

  • muestra vista previa en vivo
  • permite deshacer
  • puede ir recursivamente en dir
  • permite múltiples patrones de cambio de nombre
  • permite globos y expresiones regulares en patrones
  • recuerda la historia
Adobe
fuente
0

Pyrenamer no funcionará en mi nuevo Ubuntu 16.04 instalado, por lo tanto, tengo que encontrar otra forma de resolver este problema también.

Tengo archivos como IMG_0001.JPG, IMG_0002.JPG, ... en una carpeta. Consulte este sitio, /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

Instale el "exiv2" primero, y escribí la siguiente línea de comando:

para img en $ (ls *. [Jj] [Pp] [Gg] 2> / dev / null); do exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" renombrar "$ img"; hecho

Los nombres de los archivos de salida son AAAAMMDD_HHMMSS_0001.JPG, AAAAMMDD_HHMMSS_0002.JPG, ... etc. Incluso las fotos fueron tomadas en el mismo segundo, el número de serie original de la foto hará la diferencia.

Chuck Lee
fuente