Renombrar imágenes a tiempo exif: crear nombres de archivo únicos

11

Si cambio el nombre de las imágenes vía exiv a la fecha y hora exif, hago lo siguiente:

find . -iname \*jpg -exec exiv2 -v -t -r '%Y_%m_%d__%H_%M_%S' rename {} \;

Ahora puede suceder que las imágenes tengan exactamente la misma marca de tiempo (incluidos los segundos). ¿Cómo puedo hacer que el nombre de archivo sea único automáticamente?

El comando debe ser estable en el sentido de que si lo ejecuto en la misma estructura de directorio nuevamente (tal vez después de agregar nuevas imágenes), las imágenes ya renombradas no deberían cambiar y si se agregan imágenes con nombres de archivo existentes, los nuevos nombres de archivo deberían ser únicos también.

Mi primer intento fue dejar el nombre base original en el nombre de archivo resultante, pero luego el comando no sería estable en el sentido anterior.

estudiante
fuente
1
Extraiga la marca de tiempo, cree el nombre del archivo, verifique el nombre del archivo existente, modifique (agregue sufijo o similar) si está presente, luego mvel archivo.
Kusalananda
¿Existe también una forma más directa al agregar una opción al comando exiv2?
estudiante
Así que la respuesta utilizando exiftool sería algo así como: exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .. Tal vez podrías convertir tu comentario en una respuesta.
estudiante

Respuestas:

17

Es posible que desee probar en su jheadlugar qué es lo que viene listo para usar (con a, b... zsufijos que permiten hasta 27 archivos con la misma fecha) y no tiene el problema de estabilidad mencionado por @meuh:

find . -iname '*jpg' -exec jhead -n%Y_%m_%d__%H_%M_%S {} +

O usando exiftool(ejemplo en la página man):

exiftool -ext jpg '-FileName<CreateDate' -d %Y_%m_%d__%H_%M_%S%%-c.%%e .

(aquí con %-cser un sufijo numérico que comienza con -)

Stéphane Chazelas
fuente
3

Mi versión de exiv2(0.25 001900) preguntará interactivamente qué hacer cuando el nombre de archivo ya existe.

exiv2: File `./2013_06_19__14_03_13.jpg' exists. [O]verwrite, [r]ename or [s]kip? 

Al agregar la opción -F, agregará automáticamente un nombre adicional _1(o _2etc.) al nombre.

Renaming file to ./2013_06_19__14_01_53_1.jpg, updating timestamp

Si el comando se ejecuta por segunda vez, dice:

This file already has the correct name

y no hace nada, pero se confunde si existe la _1parte, y cambiará su nombre _2. Se alternará de esta manera de forma no destructiva en cada carrera. Puede ignorar esto si lo desea, o cambiar su findpatrón para ignorar los archivos que coinciden con el patrón de fecha con una _parte.

Por ejemplo, comienza el patrón de expresiones regulares para el formato de fecha [0-9]{4}_[0-9]{2}_.... Para simplificar, solo buscaré una combinación de 20 caracteres del conjunto 0..9y _, que es regex [0-9_]{20}. Para esto, el sufijo de _seguido por al menos 1 dígito para buscar es _[0-9]{1,}.jpg. Como la expresión regular tiene que coincidir con la ruta completa, y no solo con el nombre base, la expresión regular final, incluido el directorio, es .*/[0-9_]{20}_[0-9]{1,}.jpg.

Entonces puedes usar un hallazgo como:

find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...
meuh
fuente
1

Exiv2 puede manejarlo solo. También pasé mucho tiempo buscando ayuda en esto, hasta que fui a ver el manual exiv2. La opción -F resuelve este problema.

exiv2 -r'%Y_%m_%d__%H_%M_%S' -F *.jpg

Agregará un _N al final si el archivo ya existe.

Y para aquellos que buscan una opción que permita crear una carpeta.

exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *
J.Adler
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