Benennen Sie eine Datei basierend auf dem Tag um, der das früheste oder älteste Datum enthält?

Ich verwende den folgenden Befehl, um Bilder in einem Bash-Skript in großen Mengen umzubenennen, sodass jedes Bild nach dem Datum benannt wird, an dem das Bild aufgenommen wurde:

exiftool -r -f '-filename<${CreateDate}_${model;tr/ /_/}_%f.jpg' -d %Y%m%d_T%H%M%S%%-c -ext jpg $targetDir

Manchmal, öfter als mir lieb ist, stoße ich auf Bilder, die falsche Werte für Datumsangaben in den Metadaten haben. Zum Beispiel:

$ exiftool -*date -G -s  *.jpg
[File]          FileModifyDate                  : 2014:12:22 18:32:03-07:00
[File]          FileAccessDate                  : 2014:12:23 11:41:23-07:00
[File]          FileInodeChangeDate             : 2014:12:23 11:40:00-07:00
[EXIF]          CreateDate                      : 2014/12/23 00:52:41

In diesem Beispiel ist das FileModifyDate das Datum, das ich im CreateDate-Tag erwartet hätte, das heißt, dass das Bild 2014:12:22 18:32:03-07:00 aufgenommen wurde.

Aber da das CreateDate nicht korrekt ist, ist der neue Dateiname nicht korrekt. Nun, aus der Perspektive des Befehls zum Umbenennen der Datei ist es korrekt (Garbage In -> Garbage Out), aber ich möchte, dass das im Dateinamen verwendete Datum das Datum / die Uhrzeit ist, zu der das Bild tatsächlich aufgenommen wurde.

Gibt es in diesem Beispiel eine Möglichkeit, die Datei nach allen Datums-Tags abzufragen und dann das früheste verfügbare Datum als Datum auszuwählen, das im umbenannten Dateinamen verwendet werden soll?

Außerdem kann ich mit '${model;tr/ /_/}' alle Leerzeichen, die möglicherweise im Modell-Tag enthalten sind, durch Unterstriche ersetzen. Das ist nett, aber ich würde diesen Ausdruck lieber um den gesamten neuen Dateinamen wickeln. Da ich also „%f.jpg“ verwende, würde der resultierende Dateiname keine Leerzeichen enthalten, wenn der ursprüngliche Dateiname Leerzeichen enthalten würde. Geht das mit exiftool?

Ich vermute, dass Sie hier eher Hilfe bekommen: superuser.com/questions/tagged/exiftool
Ich habe auch das Problem, dass das Exif-Datum bei allen Dateien um einen konstanten Betrag verschoben ist. Sie könnten den Offset herausfinden und dann die korrekte Zeit für den gesamten Satz ableiten. Schließlich setzt eine Kamera nicht bei jeder Aufnahme eine zufällige andere Zeit; es wird die Uhr falsch eingestellt haben.
Oder vielleicht ist die Zeitzone des Computers oder der Kamera nicht richtig eingestellt
Wie verschieben Sie eine Frage von einer Website zur anderen, ohne sie zu duplizieren?

Antworten (2)

Ich habe die erforderlichen Schritte hier hinzugefügt:

https://github.com/pratyushtewari/exif-scripts/blob/master/README.md

Auf das älteste Datum aus Exif-Meta oder Dateinamen setzen

Schritt 0 - Exiftool von unten installieren

Installation von ExifTool

👉 Schritt 0.1

Speichern Sie die oldtimer_datetime_config im Home-Ordner C:\Users\YOURUSERNAMEoder in Ihrem Home-Verzeichnis ~oder im selben Ordner, in dem Sie exiftool installiert haben. Dieser Schritt ist wichtig, damit die folgenden Schritte erfolgreich sind. Benennen Sie die Datei um in.ExifTool_config

Sie können diese hier in einem Skript finden, aber ich habe festgestellt, dass das Ausführen der Befehle in dem pic-Ordner, den ich in den Optionen unten erwähnt habe, viel viel schneller ist als das Ausführen dieser Befehle über das Python-Skript exif-scripts/setToOldestDate.py. Für eine schnellere Verarbeitung können Sie diese ausführen Befehle direkt in Powershell aus dem pic-Ordner, den Sie planen.

Wenn Sie WSL ausführen, führen Sie diese Befehle von Poweshell und nicht WSL aus. Das Dateisystem Read Write von der Windows-Virtualisierung wird Ihren RAM sprengen und den Prozess verlangsamen und zum Stillstand bringen.

🦺 Beachten Sie, dass diese Skripte rekursiv sind und sich auf alle Unterordner auswirken werden.

Nun … jetzt – wählen Sie Ihre Optionen:

Option 1 - Falls Sie das Datum aus dem Dateinamen auswählen müssen.

Dies ist ein ziemlich flexibler und unscharfer Parser von exiftool, aber wenn Sie absolut sicher sein möchten, können Sie die Datei so ändern, dass sie yyyymmdd_hhmmss enthält und alle anderen Zahlen davor entfernt (danach ist OK).

exiftool "-FileModifyDate<filename" −overwrite_original -S -m -progress -ee -q -q ./

Option 2 - Setzen Sie alle Daten auf das älteste Datum

exiftool -overwrite_original "-FileModifyDate<OldestDateTime" "-ModifyDate<OldestDateTime" "-DateTimeOriginal<OldestDateTime" "-CreateDate<OldestDateTime" "-GPSDateTime<OldestDateTime" -S -m -progress -ee -q -q ./

Option 3 – Legen Sie den Namen der Datei in PXL_yyyymmdd_hhmmss-[number-if-conflict].extension fest

exiftool "-filename<OldestDateTime" -d PXL_%Y%m%d_%H%M%S%%-c.%%e -S -m -ee -progress -q -q ./

um alle Dateien im aktuellen Verzeichnis zu pushen

adb push -a . /sdcard/DCIM/Camera/

-a soll die Attribute erhalten.

⌛ Aktualisieren Sie den Android Media Store**

Als letzten Schritt müssen Sie die Datenbank des Android Media Store aktualisieren, um Google Fotos mitzuteilen, welche neuen Dateien gesichert werden sollen. Derzeit wird es nicht immer automatisch erkannt, also warum darauf warten. Installieren Sie Refresh MediaStore und führen Sie es aus, nachdem der ADB-Push vom Telefon abgeschlossen ist. Dann können Sie Google Fotos öffnen und sehen, dass die Sicherung beginnt.

Danke schön! Ein wichtiger Schritt, den ich übersehen habe, ist die Benennung des Exif-Skripts als.ExifTool_config
Oh ja. Ich habe den Namen nicht mit einem Punkt beibehalten, weil er in dem Moment, in dem Sie ihn heruntergeladen haben, versteckt war und die Leute weiter danach gesucht haben. Lol. Ich werde das in der Readme selbst hinzufügen.

Sie sollten in der Lage sein, einige verrücktere Perl-Ausdrücke in diesen {}s zu machen. (Eigentlich wäre ich eher versucht, etwas so Komplexes in einer anderen Sprache zu schreiben, aber um der Argumentation willen):

${CreateDate; use Date::Parse; @vals = strptime($_); sprintf("%-04d_%-02d_...", $vals[5], $vals[4]);}

Hinweis: Völlig ungetesteter Code. Ich bezweifle, dass es funktioniert. Aber es gibt Ihnen eine Richtung zum Starten, wenn Sie Perl kennen.

+1, weil, ja, so etwas. :) Und auch ein Hinweis auf einen möglicherweise besseren Ansatz: gexiv2-Python-Bindungen