Benennen Sie Bilder um, um die Zeit zu verlängern: Erstellen Sie eindeutige Dateinamen

11

Wenn ich Bilder über exiv in die exif-Datumszeit umbenenne, gehe ich wie folgt vor:

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

Jetzt kann es vorkommen, dass Bilder genau den gleichen Zeitstempel haben (einschließlich Sekunden). Wie kann ich den Dateinamen automatisch eindeutig machen?

Der Befehl sollte in dem Sinne stabil sein, dass sich die bereits umbenannten Bilder nicht ändern sollten, wenn ich ihn erneut in derselben Verzeichnisstruktur ausführe (möglicherweise nach dem Hinzufügen neuer Bilder). Wenn Bilder mit bereits vorhandenen Dateinamen hinzugefügt werden, sollten die neuen Dateinamen eindeutig sein auch.

Mein erster Versuch war nur, den ursprünglichen Basisnamen im resultierenden Dateinamen zu belassen, aber dann wäre der Befehl im obigen Sinne nicht stabil.

Schüler
quelle
1
Extrahieren Sie den Zeitstempel, erstellen Sie den Dateinamen, suchen Sie nach dem vorhandenen Dateinamen, ändern Sie (fügen Sie ein Suffix oder ähnliches hinzu), falls vorhanden, und dann mvdie Datei.
Kusalananda
Gibt es auch einen direkteren Weg, indem Sie dem Befehl exiv2 eine Option hinzufügen?
Student
Die Antwort mit exiftool wäre also ungefähr so ​​: exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .. Vielleicht könnten Sie Ihren Kommentar in eine Antwort verwandeln.
Student

Antworten:

16

Vielleicht mögen Sie versuchen jheadstattdessen , das tut , dass out-of-the-Box (mit a, b... zSuffixe zu 27 Dateien mit dem gleichen Datum ermöglicht up) und nicht das Stabilitätsproblem durch @meuh erwähnt:

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

Oder mit exiftool(Beispiel in der Manpage):

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

(hier mit %-ceinem numerischen Suffix beginnend mit -)

Stéphane Chazelas
quelle
3

Meine Version von exiv2(0.25 001900) fragt interaktiv, was zu tun ist, wenn der Dateiname bereits vorhanden ist.

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

Durch Hinzufügen einer Option -Fwird dem Namen stattdessen automatisch ein zusätzliches _1(oder _2usw.) hinzugefügt .

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

Wenn der Befehl ein zweites Mal ausgeführt wird, heißt es:

This file already has the correct name

und tut nichts, aber es wird verwirrt, wenn es das _1Teil gibt, und wird es umbenennen _2. Es wird bei jedem Lauf zerstörungsfrei umgeschaltet. Sie können dies ignorieren, wenn Sie möchten, oder Ihr findMuster ändern , um Dateien zu ignorieren, die dem Datumsmuster mit einem _Teil entsprechen.

Beispielsweise beginnt das Regex-Muster für das Datumsformat [0-9]{4}_[0-9]{2}_.... Zur Vereinfachung suche ich nur nach einer Mischung aus 20 Zeichen aus dem Set 0..9und _, die Regex ist [0-9_]{20}. Dazu ist das Suffix _gefolgt von mindestens 1 zu suchenden Ziffer _[0-9]{1,}.jpg. Da der reguläre Ausdruck mit dem gesamten Pfad und nicht nur mit dem Basisnamen übereinstimmen muss, lautet der endgültige reguläre Ausdruck einschließlich des Verzeichnisses .*/[0-9_]{20}_[0-9]{1,}.jpg.

Sie können also einen Fund verwenden wie:

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

Exiv2 kann alleine damit umgehen. Ich habe auch viel Zeit damit verbracht, Hilfe zu suchen, bis ich das exiv2-Handbuch gelesen habe. Die Option -F löst dieses Problem.

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

Am Ende wird ein _N angehängt, wenn die Datei bereits vorhanden ist.

Und für diejenigen, die nach einer Option suchen, mit der Ordner erstellt werden können.

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

Der Pyrenamer funktioniert auf meinem neu installierten Ubuntu 16.04 nicht, daher muss ich auch einen anderen Weg finden, um dieses Problem zu lösen.

Ich habe Dateien wie IMG_0001.JPG, IMG_0002.JPG, ... in einem Ordner. Überprüfen Sie diese Website unter /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

Installieren Sie zuerst "exiv2" und ich habe die folgende Befehlszeile geschrieben:

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

Die Ausgabedateinamen lauten JJJJMMTT_HHMMSS_0001.JPG, JJJJMMTT_HHMMSS_0002.JPG usw. Selbst wenn die Fotos in derselben Sekunde aufgenommen wurden, macht die ursprüngliche Fotoseriennummer den Unterschied.

Chuck Lee
quelle