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 habe die erforderlichen Schritte hier hinzugefügt:
https://github.com/pratyushtewari/exif-scripts/blob/master/README.md
Speichern Sie die oldtimer_datetime_config im Home-Ordner C:\Users\YOURUSERNAME
oder 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:
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 ./
exiftool -overwrite_original "-FileModifyDate<OldestDateTime" "-ModifyDate<OldestDateTime" "-DateTimeOriginal<OldestDateTime" "-CreateDate<OldestDateTime" "-GPSDateTime<OldestDateTime" -S -m -progress -ee -q -q ./
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.
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.
.ExifTool_config
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.
MikeW
JDługosz
Romeo Ninov
Axiopsie