Mehrere Dateiendungen im Shell Script ansprechen + Exiftool

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Saigo
Beiträge: 34
Registriert: 23.08.2013 20:01:20

Mehrere Dateiendungen im Shell Script ansprechen + Exiftool

Beitrag von Saigo » 22.09.2015 21:17:21

Hallo

Diesen Code Nutze ich um den Fotos einen Namen zuzuordnen.

Code: Alles auswählen

read -p "Autor: " autor1 autor2 autor3
exiftool -artist=''$autor1' '$autor2' '$autor3'' -overwrite_original *.jpg ;;
Mit dem folgenden Code benenne ich zur Zeit Fotos nach Datum und Aufnahmezeit um. Zur besseren Verarbeitung entferne ich die Leerzeichen und wechsel auf Kleinschreibung.

Code: Alles auswählen

for i in 'ls *.*'; do
     rename 's/\s/_/g' *
     rename 'y/[A-Z]/[a-z]/' *
     exiftool -P -'Filename<DateTimeOriginal' -d %Y-%m-%d_%Hh%Mm%Ss.%%e *
done ;;
So nun zu meinen Fragen / optimierungs Vorstellungen von leicht nach schwer (meine Einschätzung).
1. Zum einen würde ich gerne den hinzugefügten Namen wieder auslesen und als Anhang an den Dateinamen anhängen (-> Datum_Uhrzeit_Artist) Problem hierbei ist das der Name mit Vor- und Nachname gespeichert ist. Bei der benennung sollte nur der nachname genutzt werden damit der Dateiname nicht sooo ewig lang wird ;).
2. Würde ich gerne immer verschiedene Dateiendungen Ansprechen (evtl. mit array?) -> jpg JPG jpeg JPEG etc.
3. Dann würde ich gerne bei Serienbildern (die leider auch die gleich Uhrzeit haben können) hochzählen durch ein angehängtes _Zahl. Mir schwebt dazu eine if Abfrage vor, bin aber allem anderen gegenüber aufgeschlossen.

Beide Codeschnippsel sind in einer Datei mit Select und Case verbaut ;)

Also wäre für jeden Lösungsansatz und Verbesserungsvorschlag dankbar.
Zuletzt geändert von Saigo am 24.09.2015 13:35:13, insgesamt 1-mal geändert.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Mehrere Dateiendungen im Shell Script ansprechen

Beitrag von rendegast » 22.09.2015 22:58:44

Code: Alles auswählen

for i in 'ls *.*'; do
     rename 's/\s/_/g' *
     rename 'y/[A-Z]/[a-z]/' *
     exiftool -P -'Filename<DateTimeOriginal' -d %Y-%m-%d_%Hh%Mm%Ss.%%e *
done ;;

Code: Alles auswählen

for i in 'ls *.*'; do
Erstellt keine Liste von Dateinamen,
sondern eine Liste mit dem einzigen Element String "ls *.*".
Bei diesem einzigen Durchlauf werden die rename und exiftool dann auf die shell-Interpretation "*" angewandt werden,
und das klappt seltsamerweise sogar mit den Leerstellen-Namen.

Code: Alles auswählen

for i in $(ls -1 *.*); do
Problem, die Leerstellen, evtl. auch am Anfang/Ende.
rename 's/\s/_/g' "..."
rename 'y/[A-Z]/[a-z]/' "..."
->

Code: Alles auswählen

     rename 's/\s/_/g;y/[A-Z]/[a-z]/' "$NAME"

Zusammengefaßt

Code: Alles auswählen

find -type f -exec  rename 's/\s/_/g;y/[A-Z]/[a-z]/' {} \;
EDIT Wobei das eine Performancebremse wäre, da 'rename' ja gerade ein Tool für mehrere Dateien ist, also eher

Code: Alles auswählen

find -type d -exec  rename 's/\s/_/g;y/[A-Z]/[a-z]/' {}/* \;
(Das 'find' stellt eine eventuell gewünschte Rekursion sicher)


Mit den kleinen Namen ohne Leerstelle kann dann

Code: Alles auswählen

for name in $(ls -1 *.*); do
     exiftool -P -'Filename<DateTimeOriginal' -d %Y-%m-%d_%Hh%Mm%Ss.%%e $name
done
Sind aber nur Gedanken zum obigen Schnipsel.
Das 'exiftool ....' kann ich nicht beurteilen.
Zuletzt geändert von rendegast am 25.09.2015 12:39:28, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Saigo
Beiträge: 34
Registriert: 23.08.2013 20:01:20

Re: Mehrere Dateiendungen im Shell Script ansprechen

Beitrag von Saigo » 24.09.2015 13:34:51

Vielen Dank schonmal dazu. Klingt gut, ich werde mir das heute Abend dann im Detail mal anschauen und testen.

Benutzeravatar
Phineas
Beiträge: 348
Registriert: 20.06.2012 20:26:19

Re: Mehrere Dateiendungen im Shell Script ansprechen + Exift

Beitrag von Phineas » 25.09.2015 11:58:05

Die folgende Schleife kannst Du universell ausbauen. Sie findet alle Dateien, deren Namen mit .jpg oder .jpeg (Groß/Klein egal) endet und kommt mit allen erlaubten Zeichen in den Dateinamen klar (also alles, außer Slash und Nullbyte):

Code: Alles auswählen

while read -rd '' File; do
    echo "$File"
done < <(find -type f -iregex ".*\.\(jpg\|jpeg\)" -print0)
echo "$File" symbolisiert den Zugriff auf jede einzelne Datei.

Edit: Bevor ich was von den Portabilitätsterroristen auf den Deckel bekomme: Der Code ist nur für die Bash.

Saigo
Beiträge: 34
Registriert: 23.08.2013 20:01:20

Re: Mehrere Dateiendungen im Shell Script ansprechen + Exift

Beitrag von Saigo » 29.09.2015 22:25:35

Vielen Dank nochmal für die Hilfen. Hab mein Script nach euren Anregungen umgebaut, vielen herzlichen Dank!

Antworten