[Erledigt] Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rohodeb
Beiträge: 119
Registriert: 27.11.2020 09:33:45

[Erledigt] Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von rohodeb » 10.05.2022 09:44:05

Hallo Leute,
für ein kleines Problemchen benötige ich Unterstützung bzw. Hilfe.
Zum Umbenennen von Fotos, so dass der Dateiname dann auch das Aufnahmedatum enthält, benutze ich ein kleines Bash-Script, in dem Exiftool die Aufabe übernimmt. Das Script funktioniert problemlos für alle Fotos in diesem Ordner.

Nun ist es aber so, dass der Ordner in Abständen um Fotos ergänzt wird, deren Name wie folgt lauten kann: "DSCF1234.JPG".
Wenn ich das Script aufrufe, werden grundsätzlich alle Fotos abgefragt und bei Bedarf umbenannt.

Das Script sieht folgendermaßen aus:

Code: Alles auswählen

#!/bin/bash
####### Umbenennen von Fotos mit Aufnahmedatum und -zeit ###
Titel="_Urlaub2022"
cd /pfad/zum/Ordner

exiftool -P -'Filename<DateTimeOriginal' -d PIC_%Y%m%d_%Hh%Mm%Ss$Titel.%%e ./*
Ich möchte nun nur die Fotos umbenennen, die mit "DSCF" beginnen. Dazu habe ich es schon mit einer For-do-done-Schleife versucht, doch immer werden alle Fotos abgefragt.
Irgendwie fehlt mir der richtige Kniff, entweder für die Schleife oder aber für einen anderen Weg. Ist "find" vielleicht das Mittel der Wahl?

Könnt Ihr helfen?
Danke schön.
Zuletzt geändert von rohodeb am 11.05.2022 11:54:25, insgesamt 1-mal geändert.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von tobo » 10.05.2022 10:01:09

Mit for:

Code: Alles auswählen

for i in DSCF*.JPG; do
    exiftool ... "$i" ...
done
oder mit find:

Code: Alles auswählen

find . -name 'DSCF*.JPG' -exec exiftool ... {} ... \;
Falls .JPG als Endung zu eng ist, dann kann man das auch weglassen. {} bzw. "$i" steht für jeweils einen gefundenen Dateinamen. Die find-Version wäre auch rekursiv.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von JTH » 10.05.2022 10:01:45

rohodeb hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 09:44:05
Ist "find" vielleicht das Mittel der Wahl?
Absolut nicht notwendig. Und führt in manchen Fällen (Dateinamen mit Leerzeichen etwa) sogar zu Mehraufwand, zumindest wenn mans als Eingabe für eine Schleife benutzt.

Man kann Globbing (das Sternchen *) nicht nur benutzen, um alle beliebigen Dateinamen zu ersetzen. Das geht auch innerhalb eines Teildateinamens:

Code: Alles auswählen

DSCF*.JPG

Je nach dem wie streng du das Muster eingrenzen willst, ist da auch noch mehr möglich:

Code: Alles auswählen

DSCF[0-9][0-9][0-9][0-9].JPG    # Matcht die Namen mit genau vier Ziffern
DSCF+([0-9]).JPG                # Matcht mit beliebiger Anzahl Ziffern
usw.
Zuletzt geändert von JTH am 10.05.2022 10:15:25, insgesamt 1-mal geändert.
Grund: Anmerkung zu find präzisiert
Manchmal bekannt als Just (another) Terminal Hacker.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von tobo » 10.05.2022 10:03:55

JTH hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 10:01:45
rohodeb hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 09:44:05
Ist "find" vielleicht das Mittel der Wahl?
Und führt in manchen Fällen (Dateinamen mit Leerzeichen etwa) sogar zu Mehraufwand.
Das Gegenteil davon ist richtig.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von JTH » 10.05.2022 10:04:43

tobo hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 10:03:55
Das Gegenteil davon ist richtig.
Hab grad noch einen Halbsatz ergänzt ;)
Manchmal bekannt als Just (another) Terminal Hacker.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von tobo » 10.05.2022 10:11:55

Dann ist es korrekt und dann könnte man auch noch den Fall ergänzen, dass man über "-exec sh ..." eine neue Shell aufmacht. Da muss man auch ein bisschen aufpassen...

Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von hikaru » 10.05.2022 10:26:43

Bei der find-Lösung in der aktuellen Form ist außerdem zu beachten, dass sie davon ausgeht, dass keine Unterverzeichnisse mit passenden Dateien existieren, die aber nicht umbenannt werden sollen.
Insgesamt dürfte find hier aber mit Kanonen auf Spatzen geschossen sein.

rohodeb
Beiträge: 119
Registriert: 27.11.2020 09:33:45

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von rohodeb » 10.05.2022 10:41:09

Danke für Eure schnellen Hinweise.

Mit der Schleife hatte ich es ja probiert, das Entscheidende ist wohl der exiftool-Befehl selbst.

Könnte ich ihn so anwenden?

Code: Alles auswählen

exiftool -P -'$i<DateTimeOriginal' -d PIC_%Y%m%d_%Hh%Mm%Ss$Titel.%%e ./*
Ich bin mir nicht sicher, ob die Definition des Dateinamens so richtig ist: '$i<DateTimeOriginal'

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von tobo » 10.05.2022 10:46:13

"$i" gehört in "..." eingeschlossen, damit die Variable expandiert werden kann. Entweder alles in "..." einpacken oder stückeln "$i"'...'.
hikaru hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 10:26:43
Bei der find-Lösung in der aktuellen Form ist außerdem zu beachten, dass sie davon ausgeht, dass keine Unterverzeichnisse mit passenden Dateien existieren, die aber nicht umbenannt werden sollen.
Was ist das denn für eine Logik? find (oder auch for) kommt nicht mal damit klar, wenn im "aktuellen Verzeichnis" Dateien liegen, die auf das Muster passen, aber doch nicht umbenannt werden sollen.

Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von hikaru » 10.05.2022 11:05:06

tobo hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 10:46:13
Was ist das denn für eine Logik? find (oder auch for) kommt nicht mal damit klar, wenn im "aktuellen Verzeichnis" Dateien liegen, die auf das Muster passen, aber doch nicht umbenannt werden sollen.
Die Logik ist, dass Aufgabenstellungen oft unklar umrissen sind.
rohodeb hat die Aufgabe gestellt, alle Dateien im aktuellen Verzeichnis umzubenennen*, die mit DSC anfangen. Die von dir präsentierte find-Lösung benennt alle jpg-Dateien um* die mit DSC anfangen und sich im aktuellen Verzeichnis oder einem seiner Unterverzeichnisse befinden.


@rohodeb:
find und Schleifen sind interessante Werkzeuge mit denen man tolle Sachen machen kann. Aber sie haben eine Komplexität, die für die Lösung deines Problems nicht nötig ist. Dem KISS-Prinzip folgend solltest du daher dem Lösungsansatz von JTH folgen (Stichwort: "Globbing").
Tipp: Schau dir im Detail an, was dein exiftool-Kommando genau macht! Du wirst erstaunt sein, wie einfach die Lösung ist.


*) Wobei "umbenennen" hier korrekterweise ein Kopieren auf einen anderen Dateinamen bedeutet.

rohodeb
Beiträge: 119
Registriert: 27.11.2020 09:33:45

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von rohodeb » 10.05.2022 11:16:47

Aha, "Globbing",
danke wieder für die Antworten.
Ich versuche es, wenn ich wieder an meinem Rechner bin.
Melde mich dann später wieder.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von tobo » 10.05.2022 11:37:42

hikaru hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 11:05:06
tobo hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 10:46:13
Was ist das denn für eine Logik? find (oder auch for) kommt nicht mal damit klar, wenn im "aktuellen Verzeichnis" Dateien liegen, die auf das Muster passen, aber doch nicht umbenannt werden sollen.
Die Logik ist, dass Aufgabenstellungen oft unklar umrissen sind.
rohodeb hat die Aufgabe gestellt, alle Dateien im aktuellen Verzeichnis umzubenennen*, die mit DSC anfangen. Die von dir präsentierte find-Lösung benennt alle jpg-Dateien um* die mit DSC anfangen und sich im aktuellen Verzeichnis oder einem seiner Unterverzeichnisse befinden.
Richtig. Und lies dir mal oben durch, was ich geschrieben habe und dann wirst du festellen, dass ich deine beiden möglichen Fehlerquellen dort erwähnt habe!

Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von hikaru » 10.05.2022 11:48:10

Und ich habe lediglich konkretisiert, dass laut möglicherweise ungenauer Aufgabenstellung eine rekursive Lösung nicht gesucht ist.

rohodeb
Beiträge: 119
Registriert: 27.11.2020 09:33:45

Re: Mehrere Dateiendungen im Shell Script ansprechen + Exiftool

Beitrag von rohodeb » 10.05.2022 16:13:05

Mein Script sieht jetzt wie folgt aus:

Code: Alles auswählen

#!/bin/bash
####### Umbenennen der Fotos mit Aufnahmezeit und -datum
Titel="_Urlaub2022"
for i in DSCF*.JPG
do
  exiftool -P -"$i"'<DateTimeOriginal' -d PIC_%Y%m%d_%Hh%Mm%Ss$Titel.%%e ./*
done
Leider erhalte ich aber folgende Ausgabe:

Code: Alles auswählen

Warning: No writable tags set from ./DSCF0001.JPG
Warning: Invalid tag name 'dscf0004.jpg' - ./DSCF0001.JPG
Umbenannt wird leider keines der Fotos.

Weiß einer Rat?
Zuletzt geändert von JTH am 10.05.2022 16:32:14, insgesamt 1-mal geändert.
Grund: Aus https://debianforum.de/forum/viewtopic.php?t=157413 hierher verschoben

Benutzeravatar
heisenberg
Beiträge: 3542
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von heisenberg » 10.05.2022 16:52:46

Füge vor das "for"-Kommando eine Zeile mit dem Befehl "set -x" ein, dann siehst Du wie die Befehle ausgeführt werden.

Die Fehlermeldung sieht so aus, als ob der Aufruf falsch ist, weil augenscheinlich der Dateiname als Tagname interpretiert wird.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von JTH » 10.05.2022 17:00:08

rohodeb hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 16:13:05
Weiß einer Rat?
Das kann so aus mehreren Gründen noch nicht funktionieren:

rohodeb hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 16:13:05

Code: Alles auswählen

for i in DSCF*.JPG
Das ist schonmal eine passende der möglichen Varianten, um deine gesuchten Dateinamen durchzugehen.

rohodeb hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 16:13:05

Code: Alles auswählen

  exiftool -P -"$i"'<DateTimeOriginal' -d PIC_%Y%m%d_%Hh%Mm%Ss$Titel.%%e ./*
Da hapert es aber noch an mehreren Stellen:

rohodeb hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 16:13:05

Code: Alles auswählen

-"$i"'<DateTimeOriginal'
Um eine Datei mit exiftool umzubenennen, muss man anscheinend in das Pseudo-EXIF-Tag FileName schreiben. An der Stelle hat aber der Dateiname der Quelldatei, $i, nichts zu suchen. Das war eigentlich in deinem Eingangsbeitrag schon richtig:

Code: Alles auswählen

'-FileName<DateTimeOriginal'

rohodeb hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 16:13:05

Code: Alles auswählen

PIC_%Y%m%d_%Hh%Mm%Ss$Titel.%%e
Als Best Practice, um jegliche mal denkbaren Probleme hiermit auszuschließen (Leerzeichen in $Titel), würde ich diesen String in "…" verpacken:

Code: Alles auswählen

"PIC_%Y%m%d_%Hh%Mm%Ss$Titel.%%e"

rohodeb hat geschrieben: ↑ zum Beitrag ↑
10.05.2022 16:13:05

Code: Alles auswählen

  exiftool … ./*
Diese nicht weiter beschränkte Wildcard torpediert schließlich das, was du eigentlich vorhast und macht die Schleife irrelevant. Du übergibst exiftool nämlich hier wieder – und das bei jedem Aufruf in der Schleife - die Namen aller Dateien und Unterordner im aktuellen Ordner. Der Aufruf sieht also letzendlich so aus (mehr Leerzeichen für Lesbarkeit):

Code: Alles auswählen

exiftool … DSCF0001.JPG   DSCF0042.JPG   PIC_19700101_00h00m00s_Unix-Epoche.JPG   PIC_19700101_00h42m13s_Unix-Epoche.JPG   Unterordner_1
Du willst aber ja eigentlich nur die Dateien übergeben, die ins Muster DSCF*.JPG passen.

Dafür brauchst du hier überhaupt keine Schleife. Man kann exiftool auch statt eines Ordners, den es durchgehen soll, eine Liste mit Dateien übergeben. Und das geht mit dem Dateinamensmuster in der Shell auch trivial:

Code: Alles auswählen

irgendein_kommando --ein --paar --optionen DSCF*.JPG

Die einzelnen Teile zusammenzusetzen überlass ich mal dir zur Übung ;) Es wird, wie hikaru schon angedeutet hat, wohl nur eine Zeile.
Manchmal bekannt als Just (another) Terminal Hacker.

rohodeb
Beiträge: 119
Registriert: 27.11.2020 09:33:45

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von rohodeb » 11.05.2022 07:29:19

Ja, irgendetwas ist an dem Aufruf von exiftool nicht richtig. Da muss ich mich durcharbeiten.
Auf jeden Fall muss am Ende das zu bearbeitende Foto, bei mir also $i, stehen. Aktuell werden ja mit ./* auch eventuelle Fotos in Unterverzeichnissen berücksichtigt.

rohodeb
Beiträge: 119
Registriert: 27.11.2020 09:33:45

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von rohodeb » 11.05.2022 09:33:57

Ich glaube, jetzt habe ich es.
Den exiftool-Befehl habe ich geringfügig verändert, einzeln probiert und dann in eine Schleife gepackt.
Der Befehl lautet wie folgt:

Code: Alles auswählen

exiftool -P -'filename<DateTimeOriginal' -d PIC_%Y%m%d_%Hh%Mm%Ss$Titel.%%e $i
Die Variable "Titel" wird natürlich vorher im Script festgelegt, "i" ist wieder die Variable der zu findenden Fotos.
Nun erhalte ich nur die Meldungen der geänderten Fotos.

Das sollte es dann gewesen sein. Ich werde das Script mit einer größeren Zahl von Fotos erneut testen, mich dann nochmals melden.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von tobo » 11.05.2022 09:41:41

rohodeb hat geschrieben:
Aktuell werden ja mit ./* auch eventuelle Fotos in Unterverzeichnissen berücksichtigt.
Als Besonderheit von exiftool, welches mit mehreren Argumenten klar kommt und sowohl Verzeichnisse als auch Dateien verarbeiten kann. Die Shell hängt durch ./* dem Befehl eine Liste aller Dateien des aktuellen Arbeitsverzeichnisses an. Dateien sind Dateien und Verzeichniseinträge.
Das sollte es dann gewesen sein. Ich werde das Script mit einer größeren Zahl von Fotos erneut testen, mich dann nochmals melden.
Willst du mögliche Fehlerquellen reduzieren, dann solltest du deine Variablen (Titel und i) quoten:

Code: Alles auswählen

exiftool -P -'filename<DateTimeOriginal' -d PIC_%Y%m%d_%Hh%Mm%Ss"$Titel".%%e "$i"
Und ganz ohne Schleife dann sowas:

Code: Alles auswählen

exiftool -P -'filename<DateTimeOriginal' -d PIC_%Y%m%d_%Hh%Mm%Ss"$Titel".%%e DSCF*.JPG

rohodeb
Beiträge: 119
Registriert: 27.11.2020 09:33:45

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von rohodeb » 11.05.2022 11:17:10

@tobo, danke für die Tipps, werde ich nachvollziehen und realisieren.

Was bedeutet eigentlich das "quoten"?


rohodeb
Beiträge: 119
Registriert: 27.11.2020 09:33:45

Re: Bash-Script zum Umbenennen einzelner Fotos mit exiftool

Beitrag von rohodeb » 11.05.2022 11:53:53

Aha, danke schön.
ich hatte vorhin schon mal geguckt, wurde aber aus der englischen Beschreibung nicht ganz schlau. Sehr hilfreich ist Dein erster Link.

Damit kann ich dieses Thema als "Erledigt" kennzeichnen.

Vielen Dank noch einmal allen Hilfe leistenden.

Antworten