Skript zum automatischen Umbenennen von Fotos der Digitalkamera

Moderne Digitalkameras verfügen über eine hohe Bildauflösung, so dass die Bilder eine relativ hohe Dateigröße besitzen. Zwar stehen dem Anwender Speichermedien mit hoher Kapazität zur Verfügung, so dass Hunderte oder sogar Tausende Bilder von der Digitalkamera Platz finden, aber auch diese Speichermenge reicht nicht immer aus. Wer beispielsweise im Urlaub oder auf einer längeren Reise fleißig Bilder knippst, der wird sein Notebook mit ins Reisegepäck stecken, um regelmäßig den Inhalt der Speicherkarten auf den mobilen Reisepartner zu kopieren.

Und jetzt entsteht ein kleines Problem, welches zu einem großen Zeitaufwand mutiert, wenn man es manuell löst. In der Regel werden die Bildernamen auf der Kamera automatisch hochgezählt. Wird die Speicherkarte gelöscht, so fängt die Kamera wieder bei Null oder Eins an zu zählen. Aus diesem Grund muss man für jeden Kopiervorgang ein neues Verzeichnis anlegen, so dass ungefähr folgende Struktur entsteht:

Verzeichnis 1
--- PIC_0001.jpg
--- PIC_0002.jpg
--- PIC_0003.jpg
--- ...

Verzeichnis 2
--- PIC_0001.jpg
--- PIC_0002.jpg
--- PIC_0003.jpg
--- ...

Verzeichnis 3
--- PIC_0001.jpg
--- PIC_0002.jpg
--- PIC_0003.jpg
--- ...

Jetzt möchte man natürlich niemanden zumuten, sich durch die einzelnen Verzeichnisse zu navigieren. Besser wäre es, wenn man die Bilder in einem einzigen Verzeichnis ablegen könnte und die darauf folgenden Bilder einfach bei der letzten Ziffer des vorherigen Verzeichnisses hochgezählt werden.

Wer jetzt alle Bilder einzelnd umbenennt, dem steht eine schlaflose Nacht bevor. Viel einfacher ist es, wenn man diese Routineaufgabe durch ein Linux-Skript erledigen lässt. Ein solches Skript wird nun ausführlich vorgestellt.

Linux-Skript: Automatisiertes Sortieren der Bilder

Die Umsetzung des Skriptes soll folgendermaßen erfolgen: die Bilder sollen einen neuen Namen erhalten, beispielsweise dom-rep-2009. Darauf folgt die hochzuzählende Zahl, die nicht einfach bei 1, sondern bsp. bei 0001 beginnen muss. Würde man bei 1 ohne die führende 0 beginnen, so werden die Bilder später falsch sortiert, da nach der 1 die 10 käme. Zu guter letzt erhalten die Dateien die passende Endung und werden in ein neues Verzeichnis kopiert, um die alten Dateibestände unberührt zu lassen.

Das ist das fertige Skript:

#! /bin/bash

# Skript zum automatischen Umbenennen von Fotos
# von einer Digitalkamera

# Name der Bilddateien
PIC_NAME="dom-rep-2009"

# Anfangsnummer bei der Nummerierung
PIC_NUMBER="1"

# Neues Verz. der Bilddateien
PIC_VRZ="/home/chef/test2"

# Dateiendung der Dateien, die umbenannt werden
PIC_TYPE="jpg"

# For-Schleife, welche alle Dateien des oben
# definierten Typs durchläuft
for i in *.$PIC_TYPE;
do
# wenn Zahl < 10, dann 00x
if ((PIC_NUMBER<10))
then
# kopiere aktuelle Datei ($i) in das neue Vrz mit
# dem neuen Namen ($PIC_NAME, $PIC_NUMBER, $PIC_TYPE)
cp -av $i $PIC_VRZ"/"$PIC_NAME"_00"$PIC_NUMBER"."$PIC_TYPE
fi

# wenn Zahl größer/gleich 10 und kleiner 100, dann 0xx
if [ $PIC_NUMBER -ge 10 ] && [ $PIC_NUMBER -lt 100 ]
then
cp -av $i $PIC_VRZ"/"$PIC_NAME"_0"$PIC_NUMBER"."$PIC_TYPE
fi
# wenn Zahl größer/gleich 100 und kleiner 1000, dann xxx
if [ $PIC_NUMBER -ge 100 ] && [ $PIC_NUMBER -lt 1000 ]
then
cp -av $i $PIC_VRZ"/"$PIC_NAME"_"$PIC_NUMBER"."$PIC_TYPE
fi

# Nummerierung der Bilddatei hochzaehlen
((PIC_NUMBER++))
done

Erklärung:
Im ersten Teil werden die Variablen PIC_NAME, PIC_VRZ, PIC_NUMBER, PIC_TYPE definiert. Wichtig ist die Variable PIC_TYPE, da nur die Dateien in einem Verzeichnis betroffen sind, deren Dateiendung übereinstimmen.

Nun zum wichtigen Teil, nämlich die For-Schleife: das Konstrukt for i in *.$PIC_TYPE; durchläuft alle Dateien, die auf die oben definierte Endung zutreffen. In unserem Beispiel alles, was auf *.jpg zutrifft. Für jeden Treffer werden die Befehle innerhalb der Schleife (do ... done) ausgeführt.

Nun kommt die Variable PIC_NUMBER ins Spiel, die bei der vordefinierten Zahl beginnt und jedem Durchlauf der Schleife um 1 erhöht wird. Letzteres wird mit ((PIC_NUMBER++)) erreicht. Jetzt könnten wir einfach PIC_NUMBER in den Dateinamen integrieren, aber wir haben ja bereits die Problematik erkannt, wenn man ohne führende Nullen die Dateinamen festlegt.

Aus diesem Grund ist es erforderlich, die Variable PIC_NUMBER zu prüfen, ob sie aus einer (0-9), zwei (10-99), drei (100-999) oder mehr Ziffern besteht. Demzufolge werden die führenden Nullen hinzugefügt. Hinweis: In diesem Beispiel geht man davon aus, dass nicht mehr als 9999 Bilder vorhanden sind.

Für jeden Fall wurde in dem Skript eine IF-Abfrage definiert. Wenn PIC_NUMBER kleiner 10 ist, also if ((PIC_NUMBER<10)), dann werden drei Nullen davor geschrieben, so dass wir bsp. dom-rep-2009_0004.jpg erhalten. Zahlen von 10-99 sind größer/gleich 10 und kleiner 100, was mit dem Ausdruck if [ $PIC_NUMBER -ge 10 ] && [ $PIC_NUMBER -lt 100 ] abgefragt wird. -ge steht für greater and equal (größer/gleich) und -lt für less than (kleiner als). Weitere Infos dazu findet man unter man test.

Zu guter letzt definieren wir noch in jeder If-Abfrage den Kopierbefehl, so dass aus den vorgegebenen Variablen der gewünschte Dateiname entsteht: cp -av $i $PIC_VRZ"/"$PIC_NAME"_00"$PIC_NUMBER"."$PIC_TYPE sieht zwar etwas verwirrend aus, heißt übersetzt aber lediglich cp -av PIC_irgendwas.jpg neuesVrz/dom-rep-2009-0034.jpg, also ein einfach Kopierbefehl.

Anwendung

Legt zuerst ein neues Verzeichnis an, in welche die neuen Bilder kopiert werden sollen, und definiert dieses Verzeichnis in der Variable PIC_VRZ. Wechselt in der Bash einfach in das Verzeichnis mit den Bilder der Digitalkamera. Nun überlegt Euch, ab welcher Ziffer der neue Dateiname beginnen soll und tragt diesen Wert in die Variable PIC_NUMBER ein. Nun ruft Ihr das Skript auf (/home/fritz/bin/digicam.sh) auf.
Wechselt anschließend in das nächste Verzeichnis mit Bildern von der Digitalkamera und passt den Wert PIC_NUMBER an.