AI created image of Jörn Auerbach

Bilder benennen

computer science

Treue Blogleser werden festgestellt haben, dass ich lange nichts mehr veröffentlicht habe. Ein Grund dafür war unsere diesjährige Hochzeit, die viel Schreibzeit in Planungszeit umwandelte. An besagtem Tag haben etliche Teilnehmer Fotos geschossen, die uns nach und nach zugetragen wurden. Verteilt auf zig Verzeichnisse ist das natürlich nicht schön durchzuschauen. Daher habe ich die knapp 3000 Dateien in den Zeitstempel der Aufnahme umbenannt und in ein großes Verzeichnis gepackt. Nun können wir sie chronologisch durchsehen. Dabei ist es interessant zu sehen, wie zeitgleiche Momente aus verschiedenen Blickwinkeln eingefangen wurden.

Dieser Beitrag liefert eine Schritt-für-Schritt Anleitung, wie ich vorgegangen bin. Alle Fotos liegen auf einem Synology DS418j NAS.

Einleitung

Für das Unterfangen reicht die von Synology bereitgestellte grafische Oberfläche nicht aus. Außer man möchte jede Datei per Hand umbenennen. Stattdessen werden wir über ein Terminal auf das NAS zugreifen. Das Betriebssystem des NAS (DiskStation Manager) ist eine Linux-Distribution und lässt dies zu. Dafür aktivieren wir zunächst den SSH-Zugang in der NAS Systemsteuerung, indem wir unter Terminal & SNMP den Haken bei SSH-Dienst aktivieren setzen:

Screenshot des Reiters "Terminal & SNMP" in der Synology NAS Systemsteuerung

Hinweis: Um keinen Angriffsvektor für Hacking zu bieten, solltet ihr diese Eigenschaft wieder deaktivieren, wenn ihr sie nicht mehr benötigt.

Der SSH-Verbindungsaufbau gelingt über den Befehl ssh im Terminal. Dieser SSH-Client ist meist vorinstalliert, inzwischen sogar unter Windows 10.

> ssh jo3rn@DS418Play

Wenn man den Server-Namen nicht weiß, kann man auch die IP Adresse nutzen:

> ssh jo3rn@192.168.0.111

Man wird nach dem Passwort für den eingegeben Nutzer (in dem Fall jo3rn) gefragt. Wenn wir die Verbindung das erste Mal aufbauen, müssen wir außerdem mit yes noch einem Zertifikat vertrauen.

Nun sind wir bereits auf dem NAS. Da ich als Shell lieber die bash benutze, starte ich sie:

jo3rn@DS418play: bash

Gleich werden wir ExifTool benötigen, wofür wir vorher Perl installieren müssen. Das geht z.B. in der Synology Web-Oberfläche über das Paket-Zentrum:

Screenshot des Perl-Eintrags im Synology Paket-Zentrum

Ob uns Perl jetzt zur Verfügung steht, können wir zurück im Terminal prüfen:

> perl -v
This is perl 5, version 24, subversion 0 (v5.24.0) built for x86_64-linux
...

Nun ExifTool (aktuellste Version eventuell höher) mittels wget von exiftool.org downloaden...

> wget https://exiftool.org/Image-ExifTool-12.08.tar.gz

...und mit gzip entpacken:

> gzip -dc Image-ExifTool-12.08.tar.gz | tar -xf -

ExifTool lässt sich dann über den Installationspfad aufrufen. In meinem Fall residiert das ExifTool-Verzeichnis im Home-Verzeichnis:

> ~/Image-ExifTool-12.08/exiftool IMG_1748.JPG

Daraufhin werden alle möglichen Exif-Daten zu dem übergebenen Bild ausgegeben.

Hauptakt

Kommen wir zum Punkt. Das kurze Skript, was ich zum Umbenennen genutzt habe, sieht so aus:

for f in *.jpg
do
    mv -n "$f" "$(~/Image-ExifTool-12.08/exiftool -d "%Y%m%d_%H%M%S" -CreateDate "$f" | awk '{print $4"_Lydia.jpg"}')"
done

Erläuterung: Die for-Schleife mit der Wildcard * packt nacheinander alle .jpg-Dateien in die Variable f. Der Befehl mv steht für move (verschieben). Aber man kann damit auch umbenennen, indem man unter neuem Namen in das selbe Verzeichnis verschiebt. Die Option -n steht für no-clobber und verhindert das Überschreiben einer existierenden Datei. Das erste Argument ("$f") ist der Name der Ursprungsdatei, das zweite Argument (der komplette Rest des Kommandos) ist der neue Name der Datei.

Für den neuen Dateinamen wird dieses Schema verwendet: YYYYMMDD_HHHMMSS_Person (Person ist im Beispiel-Skript Lydia)

Datum und Uhrzeit entstammen den Exif-Daten der Aufnahme. Leider waren nicht alle Bild-Dateien mit Exif-Daten versehen, z.B. die per WhatsApp versendeten. Die Person, die das Foto aufgenommen hat, hänge ich hinten dran, damit es keine Konflikte gibt, sollten 2 Personen im selben Augenblick ein Foto geschossen haben.

Zum Auslesen der Exif-Daten kommt nun ExifTool ins Spiel. Der Output des exiftool-Befehls ist in diesem Format:

> ~/Image-ExifTool-12.08/exiftool -d "%Y%m%d_%H%M%S" -CreateDate IMG_1748.JPG
Create Date                     : 20200501_134434

Diese Ausgabe wird mit Pipe | an awk übergeben. awk extrahiert das vierte Feld (das Datum) und ergänzt das Ergebnis um _Person.jpg.

Schlussteil

Der Befehl als Einzeiler zum Copy-Pasten in die Shell:

> for f in *.jpg; do mv -n "$f" "$(~/Image-ExifTool-12.08/exiftool -d "%Y%m%d_%H%M%S" -CreateDate "$f" | awk '{print $4"_Lydia.jpg"}')"; done

Bei anderen Dateiformaten muss entsprechend die Dateiendung an zwei Stellen angepasst werden. Ich hatte z.B. auch .HEIC Dateien bekommen. Ich hatte auch den kuriosen Fall, dass bei einem Fotografen nicht alle Bilder nach Ausführen des Befehls umbenannt wurden. Dies war darauf zurückzuführen, dass dieser Fotograf es tatsächlich geschafft hat, zwei Bilder in der selben Sekunde aufzunehmen. Da habe ich am Ende des Kommandos einfach ein _1 an Person angehängt (also z.B. Lydia_1) und den Befehl erneut ausgeführt.