Rinomina immagini in exif time: crea nomi di file univoci


11

Se rinominare le immagini tramite exiv alla data e ora exif, faccio quanto segue:

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

Ora potrebbe accadere che le immagini abbiano esattamente lo stesso timestamp (inclusi i secondi). Come posso rendere univoco il nome file automaticamente?

Il comando dovrebbe essere stabile nel senso che se lo eseguo di nuovo sulla stessa struttura di directory (forse dopo aver aggiunto nuove immagini), le immagini già rinominate non dovrebbero cambiare e se vengono aggiunte immagini con nomi di file già esistenti, i nuovi nomi di file dovrebbero essere unici anche.

Il mio primo tentativo è stato solo di lasciare il nome base originale nel nome file risultante, ma il comando non sarebbe stato stabile nel senso sopra.


1
Estrai il timestamp, crea il nome file, controlla il nome file esistente, modifica (aggiungi suffisso o simile) se presente, quindi mvil file.
Kusalananda

C'è anche un modo più diretto aggiungendo un'opzione al comando exiv2?
studente

Quindi la risposta utilizzando exiftool sarebbe qualcosa di simile: exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .. Forse potresti trasformare il tuo commento in una risposta.
studente

Risposte:


17

Potresti voler provare jheadinvece che fa quello out-of-the-box (con a, b... zsuffissi permettendo fino a 27 file con la stessa data) e non ha il problema di stabilità menzionato da @meuh:

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

O usando exiftool(esempio nella pagina man):

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

(qui con l' %-cessere un suffisso numerico che inizia con -)


3

La mia versione di exiv2(0.25 001900) chiederà in modo interattivo cosa fare quando il nome file esiste già.

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

Aggiungendo l'opzione -F, invece, aggiungerà automaticamente un extra _1(o _2ecc) al nome.

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

Se il comando viene eseguito una seconda volta, dice:

This file already has the correct name

e non fa nulla, ma si confonde se c'è la _1parte e la rinominerà _2. Attiverà in questo modo in modo non distruttivo ad ogni corsa. Se lo desideri, puoi ignorarlo o modificare il findmodello per ignorare i file che corrispondono al modello di data con una _parte.

Ad esempio, inizia il modello regex per il formato della data [0-9]{4}_[0-9]{2}_.... Per semplificare, cercherò solo un mix di 20 personaggi dal set 0..9e _, che è regex [0-9_]{20}. Per questo è il suffisso _seguito da almeno 1 cifra da cercare _[0-9]{1,}.jpg. Poiché il regex deve corrispondere all'intero percorso, e non solo al nome di base, il regex finale, inclusa la directory, è .*/[0-9_]{20}_[0-9]{1,}.jpg.

Quindi puoi usare una ricerca come:

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

1

Exiv2 può gestirlo da solo. Ho anche trascorso molto tempo a cercare aiuto su questo, fino a quando non sono andato a vedere il manuale di exiv2. L'opzione -F risolve questo problema.

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

Aggiungerà un _N alla fine se il file esiste già.

E per quelli che sono alla ricerca di un'opzione che consenta di creare una cartella.

exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *

0

Il pyrenamer non funzionerà sul mio nuovo Ubuntu 16.04 installato, quindi devo trovare un altro modo per risolvere anche questo problema.

Ho file come IMG_0001.JPG, IMG_0002.JPG, ... in una cartella. Controlla questo sito, /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

Installare prima "exiv2" e ho scritto la seguente riga di comando:

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

I nomi dei file di output sono AAAAMMGG_HHMMSS_0001.JPG, AAAAMMGG_HHMMSS_0002.JPG, ecc. Anche le foto sono state scattate nello stesso secondo, il numero di serie della foto originale farà la differenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.