Forum: PC-Programmierung Foto-Dateinamen umbenennen minus 12 Stunden


von knips (Gast)


Lesenswert?

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?

von Pjotre (Gast)


Lesenswert?

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

von Pjotre (Gast)


Lesenswert?

> /^([\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

von thomas_m (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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
von knips (Gast)


Lesenswert?

Hmm.. ich kann kein perl, dachte es gibt was einfaches als 
Kommandozeile.. Naja macht nix.

von knips (Gast)


Lesenswert?

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]..?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Mensch (Gast)


Lesenswert?

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".

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
von knips (Gast)


Lesenswert?

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".

von Dr. Sommer (Gast)


Lesenswert?

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/

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von imonbln (Gast)


Lesenswert?

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)

von foobar (Gast)


Lesenswert?

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"

von Gunnar F. (gufi36)


Lesenswert?

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.

von Mike B. (mike_b97) Benutzerseite


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Carsten Stahl (Gast)


Lesenswert?

Mike B. schrieb:
> nix für ungut, aber die Steilvorlage war einfach zu offensichtlich

Exakt DAS habe ich bei der Anfrage auch spontan gedacht! :)

von knips (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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
von Joerg W. (joergwolfram)


Lesenswert?

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

von Mike B. (mike_b97) Benutzerseite


Lesenswert?

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

von Dr. Sommer (Gast)


Lesenswert?

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...

von Volle (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.