zur Übersicht nächste Seite

Programmschleifen

Es werden die Ausführungen von Basics 2 fortgeführt. 
In dem Ordner ~/Bla/Nur/BlaBla sind drei Textdateien vorhanden. 
Man kann den Eingabeprompt in diesen Ordner verlegen:
cd ~/Bla/Nur/BlaBla
(im Terminal eingeben und Eingabetaste drücken)
Damit werden alle Eingaben direkt in diesem Ordner ausgeführt. Die auf dieser Seite aufgeschriebenen Terminal-Eingaben auf den weißen Feldern sind so zu verstehen daß der Eingabeprompt des Terminals in diesem Ordner
~/Bla/Nur/BlaBla
liegt und daß die Zeichen aus den weißen Feldern im Terminal eingefügt werden und die Eingabetaste gedrückt wird. So ergibt
mkdir TG
einen neuen Ordner. 
Debian hat auch das Programm ImageMagick installiert - ein Bildbearbeitungsprogramm das mittels Terminal gesteuert wird. So ergibt
convert -size 30x30 xc:green Bild-green.png
eine Bilddatei mit grüner Fläche in der Größe 30x30 pixel. 
Nun gibt es 3 Textdateien, einen Ordner und eine Bild-Datei. 
Programmschleifen ermöglichen ein sehr effektives Bearbeiten von Dateien. Sie haben die Form 

for i in *.txt; do Bearbeitungsbefehle für $i A${i%.txt}B.txt; done

Erläuterung: Der Buchstabe i definiert eine Variable und kann auch durch andere Buchstaben ersetzt werden, z.B. 

for wu in *.txt; do Bearbeitungsbefehle für $wu A${wu%.txt}B.txt; done

*.txt bedeuted alle Dateien mit der Endung .txt Das könnte natürlich auch heißen *.png oder *.jpg oder *.ods oder auch 
Rechnung*.txt (alle txt-Dateien die mit Rechnung beginnen) oder 
Foto*.png (alle png-Dateien die mit Foto beginnen) 
Dann kommen die Bearbeitungsbefehle für $i (die Variable i wir durch $i angesprochen). 
Die nächsten Zeichen bestimmen wie der ausgegebene Name der neuen Datei sein wird. 
${i%.txt} bedeuted daß von rechts her zuerst die Endung .txt ausfindig gemacht wird und gelöscht wird so daß nur noch der Dateiname vor .txt übrigbleibt, dann wird der neue Name aufgebaut in der Form A(alter Dateiname)B.txt 

Als Bearbeitungsbefehl für $i wird jetzt das Umbenennen verwendet mv $i
for i in B*.txt; do mv $i R-2${i%.txt}neu.txt; done
Die Text-Datei Eko.txt wurde nicht umbenannt da diese nicht mit dem Buchstaben B beginnt, die Bild-Datei Bild-green.png wurde nicht umbenannt da diese nicht die Endung .txt hat.
for i in R*.txt; do mv $i 2${i%neu.txt}.txt; done
Bei dieser Umbenennung wurde aus den Dateinamen von rechts her 
neu.txt 
herausgelöscht.
Fortlaufende Nummern beim Umbenennen kann man ebenfalls mit Hilfe von Schleifen vergeben, wenn man eine Variable mitzählen läßt. Bei der folgenden Eingabe werden alle Dateien umbenannt. Dem neuen Namen wird vorangestellt zw und dann folgt eine durchlaufende Nummerierung mit der Endung .jpg
let a=0; for i in *; do let a=a+1; mv $i zw$a.jpg; done
Hierbei werden auch die txt-Dateien umbenannt in jpg-Dateien (was diese unbrauchbar macht) und auch der Ordner wird umbenannt. Man sollte also vorsichtig sein beim Umbenennen und vielleicht die Originaldateien in einen Bearbeitungsordner kopieren. 

Die Programmschleifen werden erst richtig effektiv wenn eine größere Anzahl Dateien vorhanden ist. Und es ist vorteilhaft wenn die bearbeiteten Dateien unter anderem Namen abgespeichert werden und die Originaldateien noch weiter existieren. Also werden jetzt alle Dateien dieses Ordners gelöscht und man gibt ein
convert -size 30x30 xc:red -duplicate 19 %02d.png
Damit erzeugt man Dateien mit zweistelliger Nummerierung. 

convert unterstützt viele Bildformate und man kann ein Bild 
B.FORMAT1
schnell in ein anderes Format übersetzen (mit anderem Namen oder dem gleichen Namen) 
D.FORMAT2
durch
convert B.FORMAT1 D.FORMAT2
Also konkret
convert B.bmp D.png
convert B.png D.gif
convert B.gif D.jpg
usw. Alleine die Endung FORMAT2 der Ausgabe-Datei D veranlasst ImageMagick zur Konvertierung der Eingabedatei B.FORMAT1
Damit lassen sich auch innerhalb eines Ordners viele Dateien gleichzeitig konvertieren z.B. von png zu gif durch
for i in *.png; do convert $i Y${i%.png}.gif; done
Nun sollen diese roten Quadrat-Dateien mit dem Dateinamen beschriftet werden (gefüllt mit schwarzer Schriftfarbe, der Schriftart FreeSerif in der Schriftgröße 24 und zentrierter Ausrichtung)
for i in *.png; do convert $i -fill black -font FreeSerif -pointsize 24 -gravity center -draw "text 0,0 '${i%.png}'" Zahl${i%.png}.png; done
Nun kann man daraus mit ImageMagick ein Zahlengif machen mit
convert Z*.png -set delay 50 -loop 0 bsp01.gif

Dabei wird jedes Bild mit einer Zeitdauer von 50 cs angezeigt und das gif wird ständig wiederholt (-loop 0). 
Nun werden die Zahlenbilder der Reihe nach um jeweils 90 Grad gedreht
let a=0; for i in Z*.png; do let a=a+1; let b=a*90; convert $i -rotate $b Dreh${i%.png}.png; done
Und jetzt wird wieder ein Zahlengif gemacht
convert D*.png -set delay 50 -loop 0 bsp02.gif

Ein weiterer Bearbeitungsbefehl
let a=0; for i in Z*.png; do let n=10*a; let m=30*a; let a=a+1; convert -size 600x220 xc:green $i -geometry +$m+$n -composite E${i%.png}.png; done
Und jetzt wird wieder ein gif gemacht
convert E*.png -set delay 50 -loop 0 bsp03.gif

Man kann auch die Z*.png Bilder benutzen um nur die Bildanzahl 20 zu verwenden und ein ganz anderes Bild zu bearbeiten
let a=0; for i in Z*.png; do let n=18*a; let a=a+1; convert Zahl06.png -background none -rotate $n F${i%.png}.png; done
Durch die Drehung ändert sich bei den Bildern jeweils die Bildgröße und diese soll nun wieder einheitlich gemacht werden
for i in F*.png; do convert -size 60x60 xc:red $i -gravity center -composite G${i%.png}.png; done
Und jetzt wird wieder ein gif gemacht
convert G*.png -set delay 10 -loop 0 bsp04.gif

Um weitere Bewegungen für eine einzelne Zahl zu erzeugen kann man diese in einen größeren Bereich setzen, z.B. für Zahl18
convert -size 90x90 xc:red Zahl18.png -gravity center -composite A18.png
Neue Bearbeitungsbefehle
let a=0; for i in Z*.png; do let b=3*a; let a=a+1; convert A18.png -crop 30x30+$b+30 +repage H${i%.png}.png; done
Und wieder ein weiteres gif
convert H*.png -set delay 10 -loop 0 bsp05.gif

Wieder neue Bearbeitungsbefehle
let a=0; for i in Z*.png; do let b=3*a; let a=a+1; convert A18.png -crop 30x30+30+$b +repage K${i%.png}.png; done
Und wieder ein weiteres gif
convert K*.png -set delay 10 -loop 0 bsp06.gif

Wieder andere Bearbeitungsbefehle
let a=0; for i in Z*.png; do let b=3*a; let a=a+1; convert A18.png -crop 30x30+$b+$b +repage L${i%.png}.png; done
Und wieder ein anderes gif
convert L*.png -set delay 10 -loop 0 bsp07.gif

Mit wenigen Terminal-Eingaben kann man Animationen erstellen. Hier noch einige Beispiele








zur Übersicht nächste Seite

Datenschutzerklärung
Impressum