Um Fotos zu verwalten und zu bearbeiten, müssen Sie nicht zwingend grafische Anwendungen einsetzen – viele dieser Aufgaben können Sie auch mit Shell-Kommandos erledigen und sparen dabei noch Zeit.
Passend zum Urlaubsfoto-Schwerpunkt dieser Ausgabe beschäftigt sich auch das Guru-Training mit Verwaltung und Bearbeitung von Fotos – dazu nutzen wir u. a. Kommandozeilentools aus dem ImageMagick-Paket [1]: Geben Sie in einer Shell convert --version ein, um zu überprüfen, ob es bereits installiert ist. Ist die Software schon vorhanden, erhalten Sie eine Rückmeldung der Form
Version: ImageMagick 6.8.6-9 2013-10-03 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2013 ImageMagick Studio LLC Features: DPC OpenMP Delegates: bzlib djvu fontconfig freetype jng jp2 jpeg lcms ltdl lzma pango pangocairo png png tiff webp wmf x xml zlib
Anderenfalls erscheint eine Fehlermeldung, und Sie müssen die Software erst installieren: OpenSuse-Anwender spielen dazu über die Softwareverwaltung ImageMagick ein, in der Shell gelingt das mit
sudo zypper install ImageMagick
Unter Ubuntu oder Kubuntu ist imagemagick die richtige Wahl:
sudo apt-get install imagemagick imagemagick-doc
Ist die Software eingerichtet, kann es losgehen.
Bilder verwalten
Zunächst geht es um elementare organisatorische Aufgaben. Wenn Ihre Kamera oder das Smartphone – wie heute üblich – Dateinamen erzeugt, die einen Zeitstempel enthalten, können Sie bequem mit mv einen großen Ordner voller Bilder anhand des Datums in Unterordner sortieren.
Für die folgenden Beispiele nehmen wir an, dass die Kamera Dateinamen der Form 2015-09-20 12.49.20.jpg erzeugt. Wenn Sie die gesammelten Werke mehrerer Jahre in einem einzigen Ordner ~/Bilder liegen haben und diese nach Jahren und Monaten getrennt umsortieren möchten, können Sie mit
$ cd ~/Bilder $ for jahr in $(seq 2012 2015); do \for monat in $(seq -f %02g 1 12); do \ mkdir -p $jahr/$monat; \ mv $jahr-$monat-* $jahr/$monat/; \ rmdir -p $jahr/$monat; \done ; done
eine Hierarchie von Unterordnern der Form 2012/01, 2012/02, …, 2012/12, 2013/01, … usw. erzeugen und alle Bilddateien in die passenden Ordner verschieben. Der abschließende rmdir-Aufruf mit der Option -p sorgt dafür, dass leere Verzeichnisse (für Monate, zu denen es keine Fotos gibt) wieder entfernt werden.
Das Kommando seq, das wir hier verwendet haben, erzeugt Sequenzen von Zahlen. Mit seq 1 12 würden Sie z. B. die Ausgabe 1 2 3 4 5 6 7 8 9 10 11 12 (mit jeder Zahl in einer eigenen Zeile) erhalten, aber durch die Option mit dem Format-String (-f "%02g") stellt das Tool den einstelligen Zahlen eine führende Null voran, so dass sich die gewünschten Zahlen (01 02 03 …) ergeben. Abbildung 1 zeigt das Verhalten von seq mit und ohne Format-Code an einem kleineren Beispiel. Mit $(...) interpretiert die Shell die vom zwischen den Klammern stehenden Kommando erzeugte Ausgabe als Teil des Befehls; die erste Zeile im längeren Befehl (for jahr in $(seq 2012 2015); do) wird also zu
for jahr in 2012 2013 2014 2015; do
Für späteres Durchsuchen der Bildersammlung ist es zudem hilfreich, wenn neben dem Zeitstempel auch der Anlass (etwa ein Urlaub) in die Namen eingebaut wird. Das erreichen Sie jetzt leicht, indem Sie in einen Unterordner (z. B. 2015/09) wechseln, dort feststellen, zu welchem Thema die Bilder gehören, und dann eine weitere Schleife verwenden, um die Dateien mit mv umzubenennen – etwa so:
$ cd 2015/09 $ for i in *jpg; do mv "$i" "Urlaub-USA-$i"; done
Dadurch wird etwa aus 2015-09-20 12.49.20.jpg die Datei Urlaub-USA-2015-09-20 12.49.20.jpg. Gehen Sie für die übrigen Ordner ähnlich vor, können Sie künftig z. B. mit
find ~/Bilder -name '*Urlaub*'
nach Urlaubsbildern suchen. Ist auf Ihrem Rechner locate installiert, gelingt die Suche auch schneller mit
locate Urlaub
Größe reduzieren
Moderne Digitalkameras und auch die in Smartphones verbauten Kameras produzieren große Bilddateien, trotz JPEG-Kompression sind z. B. die Aufnahmen eines Galaxy S4 bei 5312 x 2988 Pixeln zwischen 5 MByte und 8 MByte groß. Eine so hohe Auflösung ist prima, um großformatige Fotoabzüge zu ordern, aber für den schnellen Versand per E-Mail oder das Foto-Posting auf Facebook wäre eine kleinere Version hilfreich. Statt nun Gimp oder ein anderes GUI-Tool anzuwerfen und dort die Funktion für Größenreduktion zu suchen, nutzen Sie einfach convert aus dem ImageMagick-Paket und dessen Option -resize. Die nimmt als Argument wahlweise eine Maximalgröße in Pixeln (z. B. 1000×1000) oder eine Prozentangabe. Mögliche Aufrufe des Tools haben also die Form
convert gross.jpg -resize 1000x1000 klein1.jpg
(wobei hier kein quadratisches Bild, sondern eines mit maximalen Abmessungen von 1000 x 1000 Pixeln erzeugt wird) oder
convert gross.jpg -resize "25%" klein2.jpg
womit Sie die Pixelzahl sowohl in der Länge als auch in der Breite auf 25 % reduzieren. Den Erfolg der Umwandlung können Sie anschließend mit identify (auch aus dem ImageMagick-Paket) überprüfen:
$ identify gross.jpg klein*.jpg gross.jpg JPEG 5312x2988 5312x2988+0+0 8-bit DirectClass 8.205MB 0.000u 0:00.000 klein1.jpg[1] JPEG 1000x563 1000x563+0+0 8-bit DirectClass 457KB 0.000u 0:00.000 klein2.jpg[2] JPEG 1328x747 1328x747+0+0 8-bit DirectClass 760KB 0.000u 0:00.000 $ stat -c "%7s %n" gross.jpg klein*jpg 8205169 gross.jpg 457094 klein1.jpg 759739 klein2.jpg
Das hier im zweiten Schritt genutzte stat-Kommando eignet sich übrigens prima dazu, nur ausgewählte Informationen über Dateien auszugeben, im Beispiel Größe und Name; die Manpage zu stat verrät, welche weiteren Format-Strings neben %s (size, Größe) und %n (name, Dateiname) zur Verfügung stehen.
Die Angabe der Zielgröße (-resize 1000x1000) hat das convert-Tool nach einem Blick in die Quelldatei, die mit 5312 x 2988 Pixeln breiter als höher ist, so interpretiert, dass die Breite auf 1000 Pixel reduziert werden soll – die Höhe hat es dann proportionserhaltend angepasst: 5312/2988 = 1,777 und 1000/563 = 1,776.
Konvertieren in einem Rutsch
Gilt es, mehrere Bilder zu konvertieren, müssen Sie den convert-Aufruf nicht separat für jede Quelldatei eingeben; stattdessen können Sie in der Shell eine kleine Schleife programmieren und damit alle nötigen Schritte automatisieren. Wollen Sie z. B. zu jedem Bild in einem Ordner eine größenreduzierte Version erzeugen, bietet es sich an, einen Unterordner klein anzulegen und darin die kleinen Varianten zu erzeugen:
mkdir small for i in *.jpg; do convert "$i" -resize 800x800 "small/$i"; done
Die Anführungszeichen um $i und small/$i benötigen Sie nur, wenn die Dateinamen Ihrer Bilder Leerzeichen enthalten – das ist bei vielen Fotos der Fall, wenn die Kamera den Aufnahmezeitpunkt im Dateinamen im Format 2015-09-20 12.49.20.jpg kodiert. Ohne Anführungszeichen würde convert beim Aufruf zwei Argumente (2015-09-20 und 12.49.20.jpg) erkennen und scheitern.
Wollen Sie bei einer sehr großen Zahl an Dateien den Fortschritt der Konvertierung beobachten, lassen Sie in der Schleife zusätzlich den Namen der gerade verarbeiteten Datei anzeigen: Dazu bauen Sie einfach hinter dem Schlüsselwort do noch den Aufruf echo $i ein, den Sie mit einem Semikolon vom folgenden Befehl abtrennen, so dass sich insgesamt
for i in *.jpg; do echo $i; convert "$i" -resize 800x800 "small/$i"; done
ergibt. Abbildung 2 zeigt, wie das in der Praxis aussieht.

Abbildung 2: Mit “convert” und einer “for”-Schleife in der Shell erledigen Sie zahlreiche Konvertierungen in einem Rutsch.
Das Ändern der Größe ist nur eine von zahlreichen Konvertierungen, die Sie mit convert erledigen können; die Manpage des Programms zeigt Ihnen in einer Kurzdarstellung, was noch alles denkbar ist (Abbildung 3) – 2005 ist sogar ein 350-seitiges Buch zu ImageMagick erschienen [3], für den Einstieg bietet aber auch eine Übersicht [4] auf der Projektwebseite etliche praktische Anwendungsbeispiele.

Abbildung 3: Das Tool “convert” bietet zahlreiche Optionen, dieses Bild zeigt nur einen kleinen Ausschnitt der Manpage.
Eine interessante Anwendung von convert, die wir in diesem Artikel nicht beschreiben können, ist das Erstellen von HTML-Bildergalerien, in denen kleine klickbare Vorschaubilder zum jeweiligen großen Bild führen – wie das geht, lesen Sie in einem älteren Artikel unserer Schwesterzeitschrift LinuxUser [2].
Uploads mit “rsync”
Betreiben Sie einen eigenen Webserver, auf den Sie Fotos hochladen möchten, haben Sie wahrscheinlich auf dem Server einen Ordner eingerichtet, in dem Sie die Bilddateien sammeln. Mit scp aus dem SSH-Paket können Sie generell Dateien hochladen, doch oft ist es hilfreich, statt scp auf rsync zu setzen – das Programm synchronisiert zwei Verzeichnisse auf verschiedenen Rechnern.
Wir nehmen für die folgenden Schritte an, dass Sie auf der heimischen Linux-Maschine in Ihrem Home-Verzeichnis einen Unterordner Bilder und darunter ein Verzeichnis Web angelegt haben. Unterhalb von Web befinden sich dann weitere Verzeichnisse, die thematisch sortiert Bilder von verschiedenen Urlauben oder sonstigen Anlässen enthalten, für das Beispiel sollen diese Urlaub-2015 und Weihnachten-2014 heißen; in der Praxis wird die Liste länger sein:
daheim $ find ~/Bilder/Web -type d /home/esser/Bilder/Web /home/esser/Bilder/Web/Urlaub-2015 /home/esser/Bilder/Web/Weihnachten-2014
Auf dem Webserver gibt es passend dazu einen Ordner, der Kopien der Verzeichnisse Urlaub-2015 und Weihnachten-2014 enthalten soll, das könnte etwa /var/www/homepage/Bilder/ sein:
webserver $ find /var/www/homepage/Bilder -type d /var/www/homepage/Bilder /var/www/homepage/Bilder/Urlaub-2015 /var/www/homepage/Bilder/Weihnachten-2014
Kommen jetzt auf Ihrem Linux-PC zu Hause neue Bilder zur Sammlung hinzu, schieben Sie mit folgendem rsync-Aufruf nur die neuen (oder geänderten) Dateien auf den Webserver:
rsync -avz ~/Bilder/Web/* webserver:/var/www/homepage/Bilder/
Das setzt voraus, dass Sie SSH so konfiguriert haben, dass der Server über den Namen webserver erreichbar ist. Das gelingt z. B., indem Sie in der Datei ~/.ssh/config einen Eintrag der folgenden Form anlegen:
host=webserver hostname=langername.provider.de user=username
wobei Sie langername.provider.de und username durch den vollständigen Hostnamen des Webservers und den dort verwendeten Benutzernamen ersetzen. (Die Datei config im Ordner ~/.ssh existiert eventuell noch nicht; dann legen Sie diese neu an.)
Das rsync-Kommando kopiert nicht nur neue Bilder (und ganze Verzeichnisse) auf den Server, sondern aktualisiert auch bereits auf dem Server vorhandene Dateien, falls Sie die lokalen Versionen seit der letzten Synchronisierung (etwa mit Gimp) verändert haben.
Ausblick
Sie haben nun einige Anregungen gefunden, wie Sie Arbeitsschritte rund um die Bearbeitung Ihrer Fotos mit Shell-Tools automatisieren können, dabei helfen oft die for-Schleifen der Shell. Mit convert steht Ihnen ein regelrechtes Schweizer Taschenmesser der Bildbearbeitung zur Verfügung, mit dem Sie z. B. auch automatisch Bildausschnitte aus einem Bild ausschneiden oder ein Wasserzeichen ins Bild einfügen können [5]. Nehmen Sie sich doch die Zeit, sich mit den weiteren Features dieses Tools vertraut zu machen: Es lohnt sich.
Infos
[1] ImageMagick: http://www.imagemagick.org/
[2] Artikel zu HTML-Bildergalerien: Heike Jurzik, “Würdiger Rahmen”, LinuxUser 01/2009, S. 76 ff., http://linux-community.de/17086
[3] ImageMagick-Buch: Michael Still, “The Definitive Guide to ImageMagick”, 2005, ISBN: 1590595904
[4] Beispiele zur ImageMagick-Nutzung: http://www.imagemagick.org/Usage/
[5] Wasserzeichen mit “convert” erzeugen: http://www.imagemagick.org/Usage/annotating/#watermarking

