Sie benutzen vermutlich längst das Globbing (Ersetzen durch Platzhalter) von Zeichen ohne es zu wissen. Wenn Sie eine Datei unter Windows® angeben oder eine Datei suchen, benutzen Sie meist * als Platzhalter für eine beliebige Zeichenfolge. Beispielsweise steht *.txt für alle Dateien, deren Name mit .txt endet. Auch wir haben es in diesem Kapitel bereits oft eingesetzt. Aber ausser * gibt es noch Einiges mehr im Bereich Globbing.
Wenn Sie einen Befehl wie etwa ls *.txt eingeben und dann auf Enter drücken, so wird die Suche nach Dateien, die dem Muster *.txt entsprechen, nicht vom Befehl ls sondern von der shell selbst durchgeführt. Zum Verständnis folgt eine kurze Erklärung des Vorganges, wie eine Befehlszeile von der shell ausgewertet und abgearbeitet wird. Bei der Eingabe von:
$ ls *.txt readme.txt recipes.txt |
wird die Befehlszeile erstmal in Wörter aufgeteilt (in diesem Beispiel in ls und *.txt). Wenn die Shell ein * in einem Wort findet wird das ganze Wort als Globbing-Muster angesehen und durch die Namen aller passenden Dateien ersetzt. Also wurde der Befehl, kurz bevor er von der Shell ausgeführt wurde, zum ausführlichen Befehl ls readme.txt recipe.txt, was der Ausgabe entspricht. Auch weitere Zeichen veranlassen die Shell dazu, in gleicher Weise zu reagieren:
[...]: passt auf jedes Zeichen innerhalb der Klammern. Man kann einen Bereich von zeichen angeben (etwa 1-9) oder bestimmte Werte oder sogar beides. Beispiel: [a-zBE5-7] passt auf alle zeichen zwischen a und z, auf B, auf E, auf 5, auf 6 oder auf 7;
[!...]: passt auf alle Zeichen, die nicht in den Klammern angegeben sind. [!a-z], passt zum Beispiel auf alle Zeichen, die keine Kleinbuchstaben sind[5];
{c1,c2}: passt auf c1 oder c2, wobei c1 und c2 ebenfalls Platzhalter sind. Sie könnten zum Beispiel auch schreiben: {[0-9]*,[acr]}.
/etc/*conf: alle Dateien im Verzeichnis /etc deren Name auf conf endet. Das passt auf /etc/inetd.conf, /etc/conf.linuxconf, aber auch auf /etc/conf falls eine solche Datei existiert. Beachten Sie bitte, dass * auch für eine leere Zeichenfolge stehen kann.
image/{cars,space[0-9]}/*.jpg: alle Dateien mit der Endung .jpg in den Verzeichnissen image/cars, image/space0, (...), image/space9, falls diese Verzeichnisse existieren.
/usr/share/doc/*/README: alle Dateien mit dem Namen README in allen direkten Unterverzeichnissen von /usr/share/doc. Das passt beispielsweise auf /usr/share/doc/mandrake/README aber nicht auf /usr/share/doc/myprog/doc/README.
*[!a-z]: alle Dateien im aktuellen Verzeichnis, deren Namen nicht mit einem Kleinbuchstaben endet.
[5] Vorsicht! Das trifft auf die meisten Sprachen zu, muss aber nicht bei Ihrer Sprache zutreffen. Das hängt von der Zeichenordnung ab. In manchen Spracheinstellungen trifft [a-z] auf a, A, b, B, (...), und z zu. Und dabei reden wir noch nicht einmal von Umlauten ...