Dateimengen bearbeiten
Aus Fedorawiki.de
Dieser Artikel beschreibt, wie man mit einfachen Mitteln große Mengen an Dateien verarbeiten kann.
Inhaltsverzeichnis |
Hintergrund
Auch wenn es mittlerweile unter Linux jede Menge grafische Oberflächen für alle Zwecke gibt, greifen viele Nutzer gerne auf die Bash zurück, weil man dort mit einfachen Mitteln und wenig Aufwand sehr viel erreichen kann.
Hier wird vorgestellt, wie man mehrere Dateien auf einmal bearbeiten kann. Mögliche Anwendungen sind das Umwandeln von mehreren *.wav Dateien in *.ogg, das Umwandeln von mehreren *.ps Dateien in *.pdf oder ähnliches.
Das Prinzip: die Schleife
Das Prinzip ist, dass man eine Schleife aufbaut, die so lange läuft, wie Dateien da sind, und mit jeder neuen Datei wieder das gleiche macht. Siehe auch Schleifen mit Bash.
Der grundlegende Aufbau
Die Schleife beginnt mit dem Befehl for - er beschriebt, für welche Dateien die folgenden Aktionen durchgeführt werden sollen.
Es folgt do - hier wird gesagt, was getan werden soll.
Den Abschluss bildet done - es markiert das Ende der Schleife.
Ein einfaches (und sinnloses) Beispiel ist:
for i in *.html;do echo "Hallo";done
Dieser Befehl sucht im aktuellen Verzeichnis nach Dateien mit der Endung html, und schreibt für jede gefundene Datei das Wort Hallo in die Ausgabe, wofür der Befehl echo "Hallo" genutzt wird.
Beim Abschnitt do können natürlich auch mehrere Befehle nacheinander abgearbeitet werden. Nur der erste braucht dann das voranstehende Wort do. Alle anderen Befehle werden durch ein Semikolon abgetrennt. Unser sinnloses Beispiel würde dann wie folgt aussehen:
for i in *.html;do echo "Hallo";echo "hier";echo "wasauchimmer";done
Erklärte Beispiele
ps2pdf
Der befehl ps2pdf wandelt eine Postscript Datei in eine PDF Datei um. Die Schwierigkeit ist dabei, dass ps2pdf nicht nur einen Dateinamen zum Umwandeln erwartet, sondern auch einen Dateinamen, wie die neue Datei heißen muss.
Dafür muss der Befehlsteil nach do also eine Übergabe des Dateinamens, aber mit einer anderen Endung enthalten. Das geht so:
for i in *; do ps2pdf $i `basename $i .ps`.pdf;done
Dabei wird das Programm basename genutzt, dass bei Angabe des Dateinamens und der Endung nur den Stammnamen ohne Endung zurück gibt.