Digitale Bilder, ein Wikibuch/Download
Inhaltsverzeichnis
Einleitung
Das hier vorgestellte Bashscript automatisiert das Herunterladen und Speichern der Rohbilder. Die Vorgehensweise ist folgende:
- Kamera mit einem USB-Kabel mit dem PC verbinden
- Script starten
- Kategorie auswählen, wohin die Bilder gespeichert werden sollen
- Kamera einschalten
- Auf OK drücken
Das Bashscript überprüft nun, wieviele Verzeichnisse für Bilderserien in der gewählten Kategorie bereits existieren und generiert ein neues Verzeichnis für die neuen Fotos. Dieses Verzeichnis erhält die nächstfreie fortlaufende Nummer als Namen (4stellig mit führenden Nullen). Anschließend werden die Bilder von der Kamera geholt und in dem neuen Verzeichnis gespeichert. In diesem Zuge werden die Bilddateien auch gleich umbenannt. Geht alles automatisch...
Das Download-Script
#!/bin/bash # ========================================== Definitionen ========================================== hauptverzeichnis=$HOME/Bilder unterverzeichnis_bilder="$hauptverzeichnis"/bilder unterverzeichnis_negative="$hauptverzeichnis"/negative unterverzeichnis_baeren="$hauptverzeichnis"/baeren # =================================== Verzeichnisstruktur erstellen ================================== mkdir -p "$unterverzeichnis_bilder"/cr2 mkdir -p "$unterverzeichnis_bilder"/jpg mkdir -p "$unterverzeichnis_bilder"/tif mkdir -p "$unterverzeichnis_negative"/cr2 mkdir -p "$unterverzeichnis_negative"/jpg mkdir -p "$unterverzeichnis_negative"/tif mkdir -p "$unterverzeichnis_baeren"/cr2 mkdir -p "$unterverzeichnis_baeren"/jpg mkdir -p "$unterverzeichnis_baeren"/tif # ============================================== Funktionen =========================================== # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Debug °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° pause () { kdialog --msgbox "pause" } # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Abbruch °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° funktionsabbruch () { kdialog --msgbox "$1" exit } benutzerabbruch () { kdialog --msgbox "Abbruch durch den Benutzer" exit } # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Zuweisungen °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° zuweisung_bilder () { verzeichnis_cr2="$unterverzeichnis_bilder"/cr2 verzeichnis_jpg="$unterverzeichnis_bilder"/jpg verzeichnis_tif="$unterverzeichnis_bilder"/tif zusatz="bilder" } zuweisung_negative () { verzeichnis_cr2="$unterverzeichnis_negative"/cr2 verzeichnis_jpg="$unterverzeichnis_negative"/jpg verzeichnis_tif="$unterverzeichnis_negative"/tif zusatz="negative" } zuweisung_baeren () { verzeichnis_cr2="$unterverzeichnis_baeren"/cr2 verzeichnis_jpg="$unterverzeichnis_baeren"/jpg verzeichnis_tif="$unterverzeichnis_baeren"/tif zusatz="baeren" } # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Download °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° neues_verzeichnis () { verzeichnis_alt=`find "$verzeichnis_cr2"/* -type d | wc -l` verzeichnis_neu=$((verzeichnis_alt+1)) verzeichnis_name=`printf "%.4i" $verzeichnis_neu` mkdir "$verzeichnis_cr2"/"$verzeichnis_name" } herunterladen () { cd "$verzeichnis_cr2"/"$verzeichnis_name" gphoto2 --get-all-files --filename %04n_"$zusatz""$verzeichnis_name".%C if [ $? != 0 ] then rmdir "$verzeichnis_cr2"/"$verzeichnis_name" funktionsabbruch "Fehler" fi } laden_erfolgreich () { anzahl=`find "$verzeichnis_cr2"/"$verzeichnis_name"/* -type f | wc -l` if (( $anzahl = 0 )) then rmdir "$verzeichnis_cr2"/"$verzeichnis_name" funktionsabbruch "es gibt nichts zum Laden" fi } # ================================================= Hauptprogramm ======================================= #-----Menueauswahl----- auswahl_hauptmenue=`kdialog --caption "Hauptmenue" --geometry 200x250+500+400 --radiolist "Download der Bilder?" \ 1 "Bilder" on \ 2 "Bären" off \ 3 "Negative" off` if [ $? != 0 ] then benutzerabbruch fi case $auswahl_hauptmenue in 1) zuweisung_bilder neues_verzeichnis herunterladen laden_erfolgreich ;; 2) zuweisung_baeren neues_verzeichnis herunterladen laden_erfolgreich ;; 3) zuweisung_negative neues_verzeichnis herunterladen laden_erfolgreich ;; esac kdialog --msgbox "fertig" exit
Wohin mit dem Script
Dieses Script wird z.B. mit kate in einer einfachen Textdatei irgendwo im persönlichen User-Verzeichnis gespeichert. Ich habe, wie aus dem Start-Script ersichtlich ist, folgende Textdatei dazu genommen:
$HOME/Wiki/Scripte/Foto/Herunterladen/aktuell/bilder_laden
Diese Textdatei muß ausführbar gemacht werden.
Erklärung des Scriptes
Definitionen
Hier werden die Variablen gesetzt, die die Verzeichnisstruktur festlegen
Verzeichnisstruktur anlegen
Die notwendigen Verzeichnisse werden angelegt
Funktionen
pause ()
Ist nur für die Fehlersuche beim Programmieren notwendig
funktionsabbruch ()
Diese Funktion beendet das Script. Dabei wird eine an der Aussprungstelle definierte Benutzermeldung angezeigt.
benutzerabbruch ()
Hier wird ebenfalls das Script beendet und dabei die in der Funktion enthaltene Meldung angezeigt.
zuweisung_bilder ... ()
Variablenzuweisungen, abhängig von der Kategorie.
neues_verzeichnis ()
verzeichnis_alt=`find "$verzeichnis_cr2"/* -type d | wc -l`
Es wird nachgesehen, wieviele Verzeichnisse für Bilderserien (cr2) in der gewählten Kategorie schon existieren
verzeichnis_neu=$((verzeichnis_alt+1))
Zum Ergebnis wird 1 dazugezählt
verzeichnis_name=`printf "%.4i" $verzeichnis_neu`
Das neue Ergebnis wird 4stellig mit führenden Nullen formatiert
mkdir "$verzeichnis_cr2"/"$verzeichnis_name"
Das neue Verzeichnis für die Rohbilder wird angelegt
herunterladen ()
cd "$verzeichnis_cr2"/"$verzeichnis_name"
Es wird in das das neue Bildverzeichnis gewechselt
gphoto2 --get-all-files --filename %04n_"$zusatz""$verzeichnis_name".%C
Die Fotos werden von der Kamera in das Verzeichnis geladen und dabei gleich umbenannt nach dem bereits erläuterten Schema
if [ $? != 0 ] then rmdir "$verzeichnis_cr2"/"$verzeichnis_name" funktionsabbruch "Fehler" fi
Tritt beim laden ein Fehler auf, zum Beispiel weil die Kamera nicht bereit ist, dann bricht das Script mit einer Fehlermeldung ab. Das vorhin erzeugte Verzeichnis für die neuen Bilder wird gelöscht.
laden_erfolgreich ()
anzahl=`find "$verzeichnis_cr2"/"$verzeichnis_name"/* -type f | wc -l`
Es wird nachgesehen, ob tatsächlich Bilder heruntergeladen wurden.
if (( $anzahl = 0 )) then rmdir "$verzeichnis_cr2"/"$verzeichnis_name" funktionsabbruch "es gibt nichts zum Laden" fi
Wenn keine Bilder heruntergeladen worden sind, war nichts auf der Speicherkarte drauf. Das Script wird mit einer entsprechendn Meldung beendet, nachdem das neue Verzeichnis gelöscht wurde.
Hauptprogramm
auswahl_hauptmenue=`kdialog --caption "Hauptmenue" --geometry 200x250+500+400 --radiolist "Download der Bilder?" \ 1 "Bilder" on \ 2 "Bären" off \ 3 "Negative" off`
Anzeige des Auswahldialoges für die Kategorien
if [ $? != 0 ] then benutzerabbruch fi
Wird im Auswahldialog auf Abbrechen gedrückt, dann bricht das Script auch tatsächlich ab.
case $auswahl_hauptmenue in 1) zuweisung_bilder neues_verzeichnis herunterladen laden_erfolgreich ;; 2) ... 3) ... esac
Abhängig davon, welcher Menuepunkt ausgewählt wurde, werden die entsprechenden Funktionen aufgerufen und der Reihe nach abgearbeitet
kdialog --msgbox "fertig" exit
Fertig
Zusammenfassung
Nochmal eine Zusammenfassung dessen, was passiert:
Wenn ich die Kamera an einen USB-Anschluss des PC´s anschließe und einschalte, wird durch das Hotplugging-System (udev) die Kamera erkannt. Sobald sie erkannt wurde, sorgt die udev-Regel dafür, daß ein Script gestarten wird. Dieses Script öffnet ein Terminal, in dem dann das von ihm nun gestartete eigentliche Download-Script ausgeführt wird.
Das Downloadscript legt, wenn noch nicht vorhanden, die Verzeichnisstruktur für die Fotos fest. Es wird ein neues Verzeichnis definert und erzeugt, in das die Bilder von der Kamera heruntergeladen werden.
Und das Ganze läuft vollkommen automatisch nach einem festgelegten Schema ab.
Anmerkungen
Ich möchte darauf hinweisen, daß ich das Script erstmalig unter OpenSuse 11.3 und KDE 4.4 gebaut und getestet habe. Weiter möchte ich sagen, daß dieses Script genau auf meine Bedürfnisse zugeschnitten ist. Falls ihr es ausprobieren wollt, gerne. Aber bedenkt dabei immer, daß ihr wissen solltet, was ihr macht. Ihr solltet die Funktionsweise des Scriptes genau verstehen, um zu wissen, was geschieht, wenn ihr es startet. Alles, was ihr tut, geschieht auf eure eigene Verantwortung.