AA_knips.jpg

© koketts6, photocase.com

Knipskasten

Fotoserver mit Skripten

Wir zeigen, wie Sie mit Hilfe von Bash-Skripten einen Workflow zum Bearbeiten von Fotos aufsetzen.

Egal ob Sie ein ernsthafter Fotograf sind oder nur gelegentlich den Auslöser betätigen: Vermutlich benutzen Sie Ihren Rechner in beiden Fällen, um die Fotos Ihrer Digitalkamera zu verwalten und weiter zu modifizieren. Kein Wunder: Anwendungen wie Gimp oder Digikam machen es einfach, Fotos zu bearbeiten und zu archivieren, ohne den gewohnten Desktop zu verlassen. Um aber die Arbeitsprozesse im Umgang mit Fotos noch weiter zu vereinfachen, können Sie grundlegende Schritte mit Hilfe eines Fotoservers automatisieren. Dazu brauchen Sie lediglich ein Notebook oder einen Desktoprechner mit integriertem Kartenleser, ein Ubuntu 11.04 (oder 10.10 oder 10.04), eine handvoll Skripte und ein oder zwei Stündchen Zeit, um aus diesen Zutaten einen Fotoserver zu basteln, der die folgenden Schritte beherrscht:

  • die Fotos von der SD-Karte auf den Rechner kopieren, sie umbenennen und in Ordnern organisieren
  • Backups der Fotos auf einem USB-Stick oder über SSH auf einer entfernten Maschine anlegen
  • die Größen der Fotos ändern und sie mit Wasserzeichen versehen
  • ausgewählte Fotos auf die Flickr-Webseite hochladen
  • Fotos für alle Rechner im LAN verfügbar machen

Fotos transferieren und organisieren

Über ein relativ einfaches Bash-Skript mit dem Namen transfer.sh (Listing 1) transferieren Sie die Fotos zunächst von der SD-Karte (oder einem anderen Speichermedium) auf Ihr Ubuntu-System, benennen sie dann um und ordnen sie verschiedenen Verzeichnissen zu (Abbildung 1). Beim Umbenennen der Fotos greift Ihr Skript auf die EXIF-Metadaten der Fotos zu, um das Datum (%Y-%m-%d) und die genaue Zeit (%H-%-M-%S) für jedes einzelne Foto zu bestimmen. Die meisten aktuellen Digitalkameras versehen ihre Fotos mit diesen Informationen. Achten Sie genau darauf, die richtigen Pfad zu setzen, andernfalls löschen Sie vielleicht aus Versehen wichtige Verzeichnisse. Am besten legen Sie einen Testbenutzer an.

Abbildung 1

Abbildung 1: Das Skript aus Listing 1 kopiert die Bilder von der SD-Karte auf den Rechner und sortiert sie nach dem Entstehungsdatum.

Listing 1

 

#!/bin/bash
BENUTZER=$(id -un)
ARBEITSVERZ="/tmp"
QUELLVERZ="/media/6674-8031/DCIM/"
ZIELVERZ="/home/${BENUTZER}/fotos"
if [ ! -d "${ZIELVERZ}" ]; then
        mkdir ${ZIELVERZ}
        exit 0
fi
cd ${QUELLVERZ}
for x in $(find . -name "*.JPG" -o -name "*.CR2"); do
        cp $x ${ARBEITSVERZ}
done;
cd ${ARBEITSVERZ}
exiftool -d ${ZIELVERZ}/%Y-%m-%d/%Y-%m-%d_%H-%M-%S.%%e "-FileName<DateTimeOriginal" *.CR2
exiftool -d ${ZIELVERZ}/%Y-%m-%d/%Y-%m-%d_%H-%M-%S.%%e "-FileName<DateTimeOriginal" *.JPG
rm -rf ${ARBEITSVERZ}/*.JPG
rm -rf ${ARBEITSVERZ}/*.CR2
@KE

Ein Foto namens IMG_9753.JPG, das Sie am 17. Januar 2011 aufgenommen haben, benennt das Skript nach folgendem Schema um: 2011-01-17_19-53-37.JPG. Anschließend legt es Verzeichnisse mit dem Datum der Fotos an und kopiert sie dorthin. Das eben genannte Foto landet z. B. im Ordner 2011-01-17. Damit das Skript funktioniert, müssen Sie die EXIF-Tools installieren, die Sie über das Paket libimage-exiftool-perl auf Ihren Rechner holen.

Was macht das Skript nun im Detail? Es findet zunächst den Benutzernamen heraus (id -un) und speichert ihn in der Variablen $BENUTZER. Dann legen Sie den Pfad zum Arbeitsverzeichnis in einer Variablen ab (ARBEITSVERZ="/tmp"), ebenso den Pfad zu den Fotos, die sich auf der SD-Karte befinden (QUELLVERZ="/media/6674-8031/DCIM/"). Der Pfad weicht bei Ihrer Speicherkarte sicherlich ab, das müssen Sie prüfen. Dann brauchen Sie noch ein Zielverzeichnis (${ZIELVERZ}), in dem die Fotos später landen, im Beispiel heißt der Pfad dorthin /home/${BENUTZER}/fotos.

Den Pfad zum Ort, an dem Ubuntu die SD-Karte einhängt, müssen Sie also von Hand anpassen und in das Skript eintragen. Alternativ bauen Sie eine Abfrage in das Skript ein. Dazu kommentieren Sie den Eintrag QUELLVERZ=... aus und fügen an dieser Stelle die folgenden beiden Zeilen ein.

echo "Bitte gib den Pfad zu Deiner Speicherkarte an:"
read QUELLVERZ

Die If-Abfrage überprüft, ob das Zielverzeichnis bereits existiert. Wenn nicht (! -d), legt sie es an. Dann wechselt das Skript in den Ordner auf der SD-Karte, in dem sich die Fotos befinden. Der Find-Befehl fahndet nach sämtlichen Dateien mit den Endungen JPG und CR2. Bei jedem Treffer kopiert die For-Schleife das gefundene Bild in das Arbeitsverzeichnis (cp $x ${ARBEITSVERZ}). Findet Find keine weiteren Treffer mehr, wechselt das Skript in das Arbeitsverzeichnis.

Nun kommt Exiftool zum Einsatz. Es löscht den Dateinamen (-FileName) und liest die Datumsfelder aus den EXIF-Daten aus (<DateTimeOriginal). Aus den Daten baut es dann mit Hilfe verschiedener Variablen die neuen Ordner- und Dateinamen zusammen und legt diese im Zielverzeichnis an (${ZIELVERZ}). Dabei stehen %Y für Year, %m für month, %d für day, %H für hour usw. Die Endungen werden angehängt und abschließend die JPG- und CR2-Dateien aus dem Arbeitsverzeichnis gelöscht.

Ist das Skript fertig, speichern Sie es unter dem Namen transfer.sh und machen es ausführbar, indem Sie chmod a+x transfer.sh eingeben. Um das Skript zu starten, rufen Sie es manuell über ./transfer.sh auf. Oder Sie kopieren es über

sudo cp transfer.sh /usr/bin/transfertest.sh

an einen zentralen Ort, um es systemweit auszuführen. Nun müssen Sie lediglich transfertest.sh eingeben, um es aufzurufen. Die Umbenennung erfolgt, damit das Skript nicht mit einem anderen Programm in /usr/bin kollidiert, das den Namen transfer.sh trägt.

Fotos sichern

Damit die kopierten Fotos nicht verloren gehen, setzen Sie ein Backup-System ein und greifen dabei zum exzellenten Tool Rsync (Abbildung 2). Das lässt Sie Dateien auf einer externen Speicherkarte oder einer entfernten Maschine sichern. Weil Rsync ein Kommandozeilen-Tool ist, lässt sich der Backup-Prozess zudem mit Hilfe einfacher Skripte automatisieren. Das Backup kostet nur eine Zeile Code:

rsync -avh --delete $HOME/fotos/ /media/C2B2-9544/backup

natürlich müssen Sie $HOME/fotos/ und /media/C2B2-9544/backup durch die passenden Werte auf Ihrem System ersetzen. Bei /media/C2B2-9544/backup handelt es sich um ein Verzeichnis auf einem USB-Stick, Sie können natürlich auch eine externe Festplatte verwenden. Klappt das Sichern mit diesem Befehl, fügen Sie ihn wahlweise auch am Ende in Ihr Skript aus Listing 1 ein: rsync -avh --delete $ZIELVERZ /media/C2B2-9544/backup

Abbildung 2

Abbildung 2: Mit Hilfe von Rsync kopieren Sie die Fotos auf einen USB-Stick oder eine USB-Festplatte, um ein Backup anzulegen. Dafür genügt eine Zeile Code.

Einem Freund empfehlen