Foto-Dateinamen umbenennen minus 12 Stunden

Gast #5776897
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?
Gast #5776905
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
Gast #5776909
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
Gast #5776920
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
Moderator Persönliche Seite #5776922
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.
Gast #5776945
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".
Moderator #5776997
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
Gast #5778070
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".
Gast #5778086
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/
Moderator Persönliche Seite #5778087
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.
Gast #5778204
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)
Gast #5778232
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"
#5778233
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.
Persönliche Seite #5778279
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
Gast #5779143
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.
#5779269
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
Persönliche Seite #5779497
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
Gast #5779501
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren