Digitale Bilder, ein Wikibuch/Download
Digitale Bilder, ein Wikibuch: Verzeichnisstruktur - Bilder laden: das Script |
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 und einschalten
- Das Script startet automatisch (wie, das erkläre ich im nächsten Kapitel des Wiki-Buches) oder man startet es mit Hilfe einer Desktop-Datei
- Kategorie auswählen, wohin die Bilder gespeichert werden sollen
- Auf OK drücken
Das Bashscript überprüft nun, wieviele Verzeichnisse für Bilderserien in der gewählten Kategorie im aktuellen Jahr 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 dem Zug werden die Bilddateien auch gleich umbenannt. Geht alles automatisch...
Das Download-Script
#!/bin/bash # =========================================== Vorbereitungen ========================================= # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Definitionen °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° rohverzeichnis=$HOME/Bilder/RAW kategorie_1=Archiv kategorie_2=Baeren kategorie_3=Sonstiges jahr=`date +%Y` # ============================================== Funktionen =========================================== # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Debug °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° pause () { kdialog --msgbox "pause" } # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Abbruch °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° funktionsabbruch () { kdialog --msgbox "$1" exit } benutzerabbruch () { kdialog --msgbox "Abbruch durch den Benutzer" exit } # °°°°°°°°°°°°°°°°°°°°°°°°° Neues Download-Verzeichnis ermitteln und erstellen °°°°°°°°°°°°°°°°°°°°°°°°°° neues_verzeichnis () { jahrverzeichnis="$rohverzeichnis"/"$kategorie"/"$jahr" mkdir -p "$jahrverzeichnis" verzeichnis_alt=`find "$jahrverzeichnis"/* -maxdepth 0 -type d | wc -w` verzeichnis_neu=$((verzeichnis_alt+1)) verzeichnis_name=`printf "%.4i" $verzeichnis_neu` mkdir "$jahrverzeichnis"/"$verzeichnis_name" } # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Bilder herunterladen °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° herunterladen () { cd "$jahrverzeichnis"/"$verzeichnis_name" gphoto2 --get-all-files --filename "$kategorie"-"$jahr"-"$verzeichnis_name"_Photo-%04n.%C if [ $? != 0 ] then rmdir "$jahrverzeichnis"/"$verzeichnis_name" funktionsabbruch "Fehler" fi } # °°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Gibt es überhaupt etwas zum Herunterladen? °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° laden_erfolgreich () { anzahl=`find "$jahrverzeichnis"/"$verzeichnis_name"/* -type f | wc -l` if (( $anzahl == 0 )) then rmdir "$jahrverzeichnis"/"$verzeichnis_name" funktionsabbruch "es gibt nichts zum Laden" fi } # ================================================= Hauptprogramm ======================================= auswahl_hauptmenue=`kdialog --caption "Herunterladen der Bilder" --geometry 400x400+400+300 --radiolist "Wohin mit den Photos?" \ 1 "$kategorie_1" on \ 2 "$kategorie_2" off \ 3 "$kategorie_3" off` if [ $? != 0 ] then benutzerabbruch fi case $auswahl_hauptmenue in 1) kategorie="$kategorie_1" neues_verzeichnis herunterladen laden_erfolgreich ;; 2) kategorie="$kategorie_2" neues_verzeichnis herunterladen laden_erfolgreich ;; 3) kategorie="$kategorie_3" 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 gespeichert. Bei mir ist das:
$HOME/Scripte/Foto/Herunterladen/aktuell/bilder_laden
Die Textdatei muß ausführbar gemacht werden, wenn der automatische Scriptstart über die udev-Regel verwendet wird
Erklärung des Scriptes
Definitionen
- Festlegung der Verzeichnisstruktur für die Rohbilder
- Aktuelles Jahr ermitteln
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.
neues_verzeichnis ()
jahrverzeichnis="$rohverzeichnis"/"$kategorie"/"$jahr" mkdir -p "$jahrverzeichnis"
- Zusammensetzen des Namens für das Jahrverzeichnis.
- Erzeugen des Verzeichnisses mit allen notwendigen Mutterverzeichnissen
verzeichnis_alt=`find "$jahrverzeichnis"/* -maxdepth 0 -type d | wc -w`
Es wird nachgesehen, wieviele Verzeichnisse im aktuellen Jahr 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 "$jahrverzeichnis"/"$verzeichnis_name"
Das neue Bildverzeichnis wird angelegt
herunterladen ()
cd "$verzeichnis_cr2"/"$verzeichnis_name"
Es wird in das das neue Bildverzeichnis gewechselt (Ist notwendig für gphoto2)
gphoto2 --get-all-files --filename "$kategorie"-"$jahr"-"$verzeichnis_name"_Photo-%04n.%C
Die Fotos werden von der Kamera in das Bildverzeichnis geladen und dabei gleich umbenannt nach dem bereits erläuterten Schema
if [ $? != 0 ] then rmdir "$jahrverzeichnis"/"$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 "$jahrverzeichnis"/"$verzeichnis_name"/* -type f | wc -l`
Es wird nachgesehen, ob tatsächlich Bilder heruntergeladen wurden.
if (( $anzahl = 0 )) then rmdir "$jahrverzeichnis"/"$verzeichnis_name" funktionsabbruch "es gibt nichts zum Laden" fi
Wenn das nicht der Fall war, also nichts auf der Speicherkarte drauf ist, dann wird das Script mit einer entsprechendn Meldung beendet. Das neu generierte Verzeichnis wird gelöscht.
Hauptprogramm
auswahl_hauptmenue=`kdialog --caption "Herunterladen der Bilder" --geometry 400x400+400+300 --radiolist "Wohin mit den Photos?" \ 1 "$kategorie_1" on \ 2 "$kategorie_2" off \ 3 "$kategorie_3" off`
Anzeige des Auswahldialoges für die Kategorien
if [ $? != 0 ] then benutzerabbruch fi
Wird im Auswahldialog auf Abbrechen gedrückt, dann beendet sich das Script.
case $auswahl_hauptmenue in 1) kategorie="$kategorie_1" 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
Scriptstart
Manuell über eine Desktop-Datei
Um dieses Script zu starten, ist es sinnvoll, eine Start-Datei (Desktop-Datei) zu erzeugen. Wie so etwas realisiert werden kann, habe ich hier erläutert:
http://www.linupedia.org/opensuse/K-Men%C3%BC_und_die_Desktop-Dateien
Dabei ist zu beachten, daß das Script in einem Terminal läuft (Läßt sich in der Desktop-Datei festlegen).
Automatisch beim Einschalten der Kamera
Man kann das Script aber auch starten lassen. Und zwar immer dann, wenn man die Kamera an die USB-Buchse angeschlossen und eingeschaltet hat. Die Realisation dieses Gedankens werde ich im nächsten Kapitel des Wiki-Buches zeigen.
Anmerkungen
Ich möchte darauf hinweisen, daß ich das ursprüngliche 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 und von mir entsprechend meiner Anforderungen verbessert wurde. 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.