jörn auerbach

utilize technology

Bilder benennen

2020-10-19 jo3rncomputer 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 Moment 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 grafische Oberfläche, die Synology bietet, 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

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

Windows 10 kommt inzwischen standardmäßig mit SSH-Client. Der SSH-Verbindungsaufbau funktioniert nun auch mit diesem Betriebssystem über das Terminal:

C:\Users\jo3rn> ssh jo3rn@DS418Play

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

C:\Users\jo3rn> 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 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:

bash-4.3$ 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 downloaden…

bash-4.3$ wget https://exiftool.org/Image-ExifTool-12.08.tar.gz

…und mit gzip entpacken:

bash-4.3$ gzip -dc Image-ExifTool-12.08.tar.gz | tar -xf -

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

bash-4.3$ ~/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 im gleichen Verzeichnis bleibt. 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_Ersteller

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. Den Ersteller hänge ich hinten dran, damit es keine Konflikte gibt, sollten 2 Personen im gleichen Augenblick ein Foto geschossen haben.

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

bash-4.3$ ~/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 _Ersteller.jpg.

Schlussteil

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

bash-4.3$ 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 den Erstellernamen angehängt und den Befehl erneut ausgeführt.

Cover photo by Jon Tyson