Hi PC-Profies, ich habe eine Menge Handyfotos, bei denen die Uhrzeit nicht stimmt (falsche Zeit war eingestellt beim fotografieren). Also die Datei heißt z.B. 20190104_032211.jpg und ich würde sie gerne irgendwie automatisch umbenannt haben 12 Stunden eher, also sie müsste dann heißen 20190103_152211.jpg. Momentan hab ich hier einen Ubuntu-PC, könnte zur Not auch die Daten irgendwo auf Windows tun.. Wer hat eine Idee?
Ausgangspunkt: alle Dateien in einen Ordner In einer Programmiersprache deiner Wahl (perl eignet sich z.B. wunderbar): - Liste aller Dateinamen im Ordner einlesen - mit regular expression matchen und in Gruppen zerlegen - z.B.: /^([\d]{4})([\d]{2})([\d]{2})_([\d]{2})([\d]{2})([\d]{2})\.jpg&/ - die Gruppen (Jahr, monat, Tag, stunden, minuten, sekunden) entsprechend umrechnen - wieder neuen dateinamen zusammenpatschen - Datei umbenennen (und, damit du dich nicht selber überschreibst, in neuen Ordner schieben) Grüße Pjotre
> /^([\d]{4})([\d]{2})([\d]{2})_([\d]{2})([\d]{2})([\d]{2})\.jpg&/
ups, das "&" am ende der regexp muss natürlich ein "$" sein..
awk/sed eignen sich für sowas auch wunderbar wenn man damit umgehen kann
- was auf mich nicht zutrifft :)
Gruß,
Pjotre
Irfanview. Thumbnails aufrufen --> Batch Konvertierung dort Batch-Umbennung Dann sind verschiedene Patern möglich, dann siehe in der dortigen Hilfe Müßte mit dem datei Datum und mit dem Exifdatum gehen. Da ich vermute, das Deine Dateien im Datum geändert werden müssen, Total Commander mit dem Addon Addtime vorher das (Datei-) Datum der gespeicherten Dateien ändern, z.B. auf -12h - geht damit auch im Batch Modus. Weiterhin müßte Geosetter Dir auch weiter helfen können. thomas_m
Musst du auch Monatsgrenzen überschreiten (also vom 1. eines Monats auf den letzten des Vormonats wechseln)? Wenn ja, dann würde ich zu einer Scriptsprache mit eingebauter Datums- und Uhrzeitbearbeitung greifen (Python, Perl, …). Wenn nein, dann sollte sowas gehen:
1 | for file in *.jpg |
2 | do |
3 | yearmon=$(expr $file : '\([0-9][0-9][0-9][0-9][0-9][0-9]\).*') |
4 | day=$(expr $file : '[0-9][0-9][0-9][0-9][0-9][0-9]\([0-9][0-9]\).*') |
5 | hour=$(expr $file : '.*_\([0-9][0-9]\).*') |
6 | trailing=$(expr $file : '.*_[0-9][0-9]\(.*\)') |
7 | if [ $hour -ge 12 ] |
8 | then |
9 | $hour=$(expr $hour - 12) |
10 | else |
11 | $hour=$(expr $hour + 12) |
12 | $day=$(expr $day - 1) |
13 | fi |
14 | mv $file $yearmon$day_$hour$trailing |
15 | echo mv $file $yearmon$day_$hour$trailing done. |
16 | done |
Edit: ließe sich sicher auch noch auf das Rückschreiten zum Vormonat ausdehen, wird aber dann immer komplexer. Da gewinnen die Scriptsprachen dann wirklich, denn da subtrahiert man einfach 12 * 3600 Sekunden.
:
Bearbeitet durch Moderator
Hmm.. ich kann kein perl, dachte es gibt was einfaches als Kommandozeile.. Naja macht nix.
Jörg W. schrieb: > Musst du auch Monatsgrenzen überschreiten (also vom 1. eines Monats auf > den letzten des Vormonats wechseln)? nein Jörg W. schrieb: > yearmon=$(expr $file : '\([0-9][0-9][0-9][0-9][0-9][0-9]\).*' Ich glaube ich verstehe, was das Programm machen soll, außer die Stelle mit den vielen [0-9]..?
knips schrieb: > außer die Stelle mit den vielen [0-9] Regulärer Ausdruck (regular expression, RE) für "ein Zeichen von 0 bis 9". Leider versteht der Doppelpunkt-Operator in "expr" nur ganz einfache reguläre Ausdrücke (basic REs), woanders könnte man stattdessen auch "\d" (match one digit) schreiben.
Kopiere zuerst alle Dateien als Hardlink (cp -l) in ein neues Verzeichnis, damit du bei Umbenennungsfehlern einfach zurueckrollen kannst. Danach:
1 | $ for f in *.jpg; do echo mv "$f" "$(date -ud "@$(echo "$(date -ud "$(printf '%s' 20190104_032211.jpg | sed 's/_\(..\)\(..\)\(..\)\.jpg/ \1:\2:\3/')" +%s) - 12*3600" | bc -ql)" +%Y%m%d_%H%M%S.jpg)"; done |
2 | mv 20190104_032211.jpg 20190103_152211.jpg |
Und wenn das plausibel aussieht, ersetze "do echo" durch "do".
Hier ist (deutlich zu spät, weil meine Versuche vorhin durch externe Ereignisse unterbrochen wurden) noch meine Variante, die wie Menschs Vorschlag auf den Konvertierungsfunktionen von date beruht, aber auf sed und bc verzichtet:
1 | #!/bin/bash
|
2 | for f in *.jpg; do |
3 | iso="${f:0:4}-${f:4:2}-${f:6:2} ${f:9:2}:${f:11:2}:${f:13:2}" |
4 | unix=$(date -d "$iso" +"%s") |
5 | let unix=unix-12*3600 |
6 | f2=$(date -d @$unix +"%Y%m%d_%H%M%S.jpg") |
7 | mv "$f" "$f2" |
8 | done
|
Enthält das Verzeichnis die Dateien 20170101_023001.jpg und 20190104_032211.jpg, werden folgende Befehle ausgeführt:
1 | mv 20170101_023001.jpg 20161231_143001.jpg |
2 | mv 20190104_032211.jpg 20190103_152211.jpg |
:
Bearbeitet durch Moderator
Yalu X. schrieb: > Hier ist (deutlich zu spät, weil meine Versuche vorhin durch externe > Ereignisse unterbrochen wurden) noch meine Variante, die wie Menschs > Vorschlag auf den Konvertierungsfunktionen von date beruht, aber auf > sed und bc verzichtet Vielen Dank, ich konnte auch erst heute testen - das funktioniert perfekt und auf Anhieb! Ich habe noch ein paar Minuten korrigiert, nach dem ich die Zeile mit dem let inkl. punkt vor Strichrechnung verstanden hatte - super!!! Auch wenn es schon fertig ist, habe ich viel gelernt, so z.B. auch wie man Teile aus dem Dateinamen bekommt ohne "expr".
Wahrscheinlich haben die Fotos auch EXIF-Daten, in welchen das falsche Datum noch einmal steht. Foto-Verwaltungssoftwares könnte das verwirren. Name und EXIF-Datum kann man mit jhead ändern, z.B.: Datum in EXIF-Daten korrigieren: jhead -ta-12:00 *.jpg Dateien umbenennen anhand EXIF-Daten: jhead "-n%Y%m%d_%H%M%S.jpg" *.jpg Zuletzt-Geändert-Datum im Dateisystem an EXIF-Daten anpassen: jhead -ft *.jpg http://www.sentex.net/~mwandel/jhead/usage.html https://wiki.ubuntuusers.de/JHead/
knips schrieb: > so z.B. auch wie man Teile aus dem Dateinamen bekommt ohne "expr" Du solltest nur im Hinterkopf behalten, dass die "substring expansion" ${variable:start:end} ein Bashismus ist, also nicht durch Posix in der Standard-Shell genormt. Mit explizit /bin/bash klappt das natürlich, aber bei /bin/sh kannst du dich (auch bei Linux) nicht drauf verlassen.
in python müsste das relative einfach gehen (ohne es jetzt getestet zu haben), sicher wird auch noch etwas magic darum nötig um den Code robust zu machen aber es läuft auf folgendes raus und die ganzen Corner case sind durch das datetime module abgehandelt.
1 | import datetime |
2 | import os |
3 | |
4 | |
5 | def convert(filename, offset=-12): |
6 | tfmt = '%Y%m%d_%H%M%S' |
7 | file, ext = os.path.splitext(filename) |
8 | current_date = datetime.datetime.strptime(file, tfmt) |
9 | newdate = current_date + datetime.timedelta(hours=offset) |
10 | new = newdate.strftime(tfmt) + ext |
11 | os.rename(filename, new) |
Yalu schrieb: > unix=$(date -d "$iso" +"%s") > let unix=unix-12*3600 > f2=$(date -d @$unix +"%Y%m%d_%H%M%S.jpg") Date kennt den Trick "12 hours ago", damit kann man das vereinfachen zu:
1 | f2=$(date -d "$iso 12 hours ago" +"%Y%m%d_%H%M%S.jpg" |
Ich habe ähnliches schon in Excel erledigt: Directory mit dir /on > inh.txt einlesen, die inh.txt nach Excel importieren, dann per Tabellenfunktion den Teil des Namens "ausschneiden", modifizieren und am Ende mit einer Spalte = "ren" ZELLE & " " & ZELLE2 eine Batchdatei erzeugt. Das geht. Bequem ist anders.
knips schrieb: > Hi PC-Profies, ich habe eine Menge Handyfotos, bei denen die > Uhrzeit > nicht stimmt (falsche Zeit war eingestellt beim fotografieren). rofl, welche Fotos sind denn so wichtig, dass man die Zeit um 12h zurückdrehen muss? vom Urlaub? von den Haustieren, den Kindern? oder doch irgendwelches belastenden Material`? nix für ungut, aber die Steilvorlage war einfach zu offensichtlich
foobar schrieb: > Date kennt den Trick "12 hours ago" Danke für den Tipp. Das kannte ich noch nicht. Da gibt es ja eine Unzahl von Möglichkeiten, das Datum und die Uhrzeit zu modifizieren.
Mike B. schrieb: > nix für ungut, aber die Steilvorlage war einfach zu offensichtlich Exakt DAS habe ich bei der Anfrage auch spontan gedacht! :)
Mike B. schrieb: > rofl, welche Fotos sind denn so wichtig, dass man die Zeit um 12h > zurückdrehen muss? Das ist ganz einfach: Wenn man nicht allein auf der Welt ist, sondern in Familie im Urlaub, hat man Fotos von mehreren Geräten. Wenn man die Fotos dann hinterher zusammen anschaut, ist es schön, wenn es nicht nach den Fotos vom Abend wieder mit denen vom Mittag vom gleichen Tag von der andern Kamera weitergeht - sondern wenn sie also chronologisch richtig sortiert sind.
Dafür dürfte allerdings Dr. Sommers Einwand, stattdessen die EXIF-Daten zu korrigieren, viel wesentlicher sein. Denn bei 08/15-Kameras (!= Handy) hast du sowieso nur Dateinamen a la IMG0815.JPG, aus denen du keine Reihenfolge (in Kombination mit Dateien aus anderen Quellen) ableiten kannst.
:
Bearbeitet durch Moderator
Ich kenne das, besonders wenn man Bilder von Leuten aus unterschiedlichen Zeitzonen in eine chronologische Reihenfolge bringen will. Da ich versuche, mir unnötige Arbeit vom Hals zu halten, habe ich das natürlich mit PERL-Scripten automatisiert... Da (glücklicherweise?) derzeit keine 2 gleichen Geräte und Smartphones sowie verschiedene Kameras verwendet werden, werte ich mit einem Perl-Script den EXIF Header aus und korrigiere die Zeit in selbigem abhängig vom im Header angegebenen Kamera-Modell. Die Dateinamen hingegen werden "plattgemacht" und die Bilder nach bilderverzeichnis/JAHR/MONAT/TAG/LFDNUM sortiert und in der Größe angepasst (meistens wird runterskaliert). Manuell muss ich dann nur noch uninteressante, unscharfe und Mehrfachaufnahmen löschen und ggf. Bilder drehen. Dann per Stick->Fernseher oder per weiterem Script eine Galerie für die Webseite erzeugen lassen. Jörg
knips schrieb: > Mike B. schrieb: >> rofl, welche Fotos sind denn so wichtig, dass man die Zeit um 12h >> zurückdrehen muss? > > Das ist ganz einfach: Wenn man nicht allein auf der Welt ist, sondern in > Familie im Urlaub, hat man Fotos von mehreren Geräten. hast gewonnen, aber gib zu, die Steilvorlage war einfach zu offensichtlich Jörg W. schrieb: > Dafür dürfte allerdings Dr. Sommers Einwand, stattdessen die > EXIF-Daten > zu korrigieren, viel wesentlicher sein. Denn bei 08/15-Kameras (!= > Handy) hast du sowieso nur Dateinamen a la IMG0815.JPG, aus denen du > keine Reihenfolge (in Kombination mit Dateien aus anderen Quellen) > ableiten kannst. dafür hatte ich mir in Delphi mal ein kleines Tool geschrieben was das Aufnahme/Erstellungsdatum ausliest und dem Dateinamen per Umbenennen voranstellt dann stimmt auf fast allen Geräten die Abspielreihenfolge korrekte Daten vorausgesetzt
Mike B. schrieb: > dafür hatte ich mir in Delphi mal ein kleines Tool geschrieben was das > Aufnahme/Erstellungsdatum ausliest und dem Dateinamen per Umbenennen > voranstellt Eben das macht jhead, und noch diverses anderes. Ich finde das Programm super praktisch. Dann noch Shotwell zur Bilderverwaltung...
das Filedatum hast nichts mit den EXIF oder IPTC Daten zu tun. ordentliche Bildbetrachtungs- oder Bearbeitungsprogramme lesen IPTC und lesen und schreiben EXIF Daten
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.