Von convert zu Shellskripting

Langsam aber sicher rückt die diesjährige O-Phase an meiner Uni immer näher, bei der ich, ebenso wie letztes Jahr, als Tutor für die Erstis teilnehmen werde. Dieses Jahr habe ich mich dazu bereiterklärt mich für unsere Gruppe “φ macht auch μst” um eine Homepage zu kümmern. Homepage gut und schön, ist ja keine große Sache. Was mich allerdings ein klein wenig Überlegungen kostete war, wie man die Fotos die während der Woche geschossen werden am besten aufbereitet und auf die Homepage stellt. Natürlich gibt es fertige Programme die ganze Bildergalerien mit Layout usw. erstellen, aber ich wollte die Fotos gerne schön eingebettet in die Homepage haben. Wobei sich mir dann nun die Frage stellte, wie ich die Fotos möglichst schnell auf die richtige Größe skalieren und Vorschaubilder erzeugen kann. Denn die Auflösung die direkt von den Kameras kommt ist ja meist bedeutend größer als man für ein bequemes angucken im Internet gerne hätte.

Eine Lösung zum skalieren war mit convert aus der Programmsammlung imagemagick auch schnell gefunden. Da ich allerdings ja nicht nur die Bilder skalieren, sondern auch gleich noch Vorschaubilder erstellen wollte musste ich also zwei Befehle ausführen. Aber das ist ja viel zu viel Arbeit. 😀
Also packte ich beide Befehle in eine Datei und ein Shellskript war geboren. Zu diesem fügte ich dann recht schnell noch andere Features wie vernünftige Fehlermeldungen bei nicht installiertem convert, die Möglichkeit das Verzeichnis in dem die zu konvertierenden Dateien liegen per Kommandozeilenparameter festzulegen, usw. hinzu.

Irgendwann versuchte ich dann eine größere Anzahl an Bildern zu konvertieren und stellte mit Erschrecken fest, dass der Speicherhunger von convert dabei ins Unermessliche stieg und mein System zum swappen brachte. Das konnte natürlich so nicht weitergehen. Also war ich gezwungen das massenkonvertieren der Dateien durch eine Schleife zu ersetzen bei der in jedem Durchlauf genau eine Datei konvertiert wird. Und voila: Schon hält sich der Speicherhunger in Grenzen.

Was ich ebenso tat war, dafür zu sorgen dass die ersten 10 Dateien vor ihre Laufnummer noch eine 0 bekamen, damit auch bei vielen Zahlen eine sinnvolle Reihenfolge gegeben ist (statt pic1.jpg, pic2.jpg, … pic9.jpg, pic10.jpg, pic11.jpg … dann pic01.jpg, pic02.jpg, … pic09.jpg, pic10.jpg, pic11.jpg …). Wobei mir dann auffiel, dass das ja nur für eine zweistellige Anzahl an Bildern funktioniert und bei einer größeren Anzahl an Bildern wieder das gleiche Dilemma besteht. Und dafür habe ich bisher noch keine Lösung gefunden. Ich möchte also, dass die laufende Nummer jedes Bildes genausoviele Stellen hat wie die des letzten Bildes. Gibt es zum Beispiel 43289 Bilder, dann möchte ich, dass das Erste halt nicht pic1.jpg, sondern pic00001.jpg heißt. Meine bisherige Variante, ein regulärer Ausdruck, scheint da nicht zu funktionieren, da die dazu nötige wenn-dann Logik bei regulären Ausdrücken fehlt. Zumindest so wie ich das grade sehe.
Ein anderer Ansatz wäre einen regulären Ansatz innerhalb einer Schleife zu haben, der bei jedem Durchlauf eine 0 ergänzt. Das ist an sich kein Problem, allerdings ist mir noch keine sinnvolle Möglichkeit eingefunden wie man die Schleifendurchläufe pro Datei steuern soll.
Vielleicht hat ja von meinen treuen Lesern da jemand eine Idee. 🙂

Aber was ich eigentlich mit dieser ganzen Geschichte sagen wollte ist, dass ich es irgendwie lustig finde, wie mir auf einmal aus einem einzigen Befehl zu Vereinfachung einer Arbeit ein ausgewachsener Shellskript entstanden ist. 🙂

3 Comments


  1. hmm..
    ein `ls *.jpg | wc -l` würd dir die anzahl der Bilder liefern..
    ich habs grad mal ausprobiert .. ein `ls *.jpg | wc -l | wc -c` liefert dir $Anz_Stellen + 1. Vielleicht kannst du damit was anfangen 😉


  2. Ah super, danke. Ich glaube das hilft mir weiter.


  3. width=`ls *.jpg | wc -l | wc -c | xargs expr -1 +`
    index=1
    for from in *.jpg
    do
    to=`printf pic%0${width}i.jpg $index`
    echo “$from -> $to”
    index=`expr $index + 1`
    done

Leave a Reply

Your email address will not be published. Required fields are marked *