Schleifen über Dateinamen

Diese Seite gehört zum Shellkurs.

 

Eine häufige Anwendung von Shellcode (ob als Script oder in einer interaktiven Shell) sind Schleifen, die über (nicht vorgegebenen) Dateinamen operieren. Also etwa das Kopieren, Verschieben oder Umbenennen von Dateien mit bestimmter Endung oder aller Dateien in einem Verzeichnis.

 

Die Grundstruktur einer Schleife (unabhängig von Dateien) sieht so aus:

for variablenname in ...; do ...; done

  • Die Schleife wird mit "for" eingeleitet.
  • Innerhalb der Schleife muss der aktuelle Wert  referenziert werden können. Dafür wird der Name der Variablen angegeben, der er zugewiesen wird.
  • Wenn die Schleife sich nicht auf die Aufrufparameter des Programms oder der aktuellen Funktion bezieht, sondern etwa auf Dateinamen, dann müssen diese Werte mit dem Schlüsselwort "in" eingeleitet werden.
  • Die Schlüsselworte "do" und (nach einem Semikolon) "done" begrenzen die Kommandos, die in jedem Durchlauf ausgeführt werden. Das kann ein einzelnes Kommando sein, aber auch viele komplizierte Kommandostrukturen sind möglich.

 

Wenn man alle (nichtversteckten) Dateien mit der Endung ".txt" bearbeiten möchte, erfolgt die Auswahl der Schleifenelemente über pathname expansion: Ein globbing-Ausdruck wird auf alle Dateinamen im aktuellen (oder entsprechenden) Verzeichnis angewendet.

Die einfachste Variante des Globbings kennt die beiden Sonderzeichen "*" und "?", wobei "*" für beliebig viele Zeichen steht (das schließt null Zeichen ein) und "?" für genau ein Zeichen.

 

Globbing-Beispiele

  • "*.txt" passt auf z.B. "a.txt", "abc.txt" und "ab 123 ,% def.txt"
  • "?.txt" passt auf "a.txt", aber nicht auf "abc.txt"
  • "??*.txt" passt auf Dateien mit mindestens zwei Zeichen vor dem Punkt, also "abc.txt", aber nicht "a.txt".
  • Dateien mit Datum im Namen wie "2015-10-14--etc.tar" passen auf das Globbing-Muster "20??-??-??--etc.tar". Es passt auch auf "*etc.tar", aber ein detaillierteres Muster vermeidet Fehltreffer (unbeabsichtigte Dateien, die zufällig passen).

 

Quoting

Variablen, die Whitespace (Leerzeichen, Tabilatoren, Zeilenumbrüche) enthalten, müssen speziell gehandhabt werden. Dies wird erreicht, indem sie nur innerhalb von doppelten Anführungszeichen verwendet werden:

text="foo     bar"
echo $text
echo "$text"

Die Verwendung von Anführungszeichen ist nicht immer nötig, "schadet aber nie". Um sich die jeweilige Klärung und das damit verbundene Risiko zu ersparen, sollte man sie immer verwenden; das gilt insbesondere für nicht besonders erfahrene Nutzer.

 

Schleifen-Beispiel

for file in *.txt; do
echo "Als nächstes wird diese Datei bearbeitet: '${file}'"
ls -l "$file"
done