Pathname Expansion (Globs)
Glob-Muster (Wildcards) werden von der Shell zu einer Liste von Dateinamen expandiert, die auf das Muster passen. Das passiert vor der Ausführung des eigentlichen Befehls – das Programm sieht nur die fertige Liste, nicht das Muster.
echo macht das gut sichtbar: Es gibt einfach aus, was die Shell ihm als Argumente übergibt.
Ordnerbeispiele/
Ordnerdokumente/
- …
- bild.jpg
- brief.txt
- notizen.txt
- skript.sh
echo *# bild.jpg brief.txt dokumente notizen.txt skript.shDie Shell hat * expandiert und echo eine fertige Liste übergeben – als hätte man alle Namen einzeln eingetippt.
Die Wildcards
Abschnitt betitelt „Die Wildcards“* – beliebig viele Zeichen
Abschnitt betitelt „* – beliebig viele Zeichen“* steht für eine beliebige Folge von Zeichen (auch leer):
echo *.txt# brief.txt notizen.txt
echo b*# bild.jpg brief.txt
echo *i*# bild.jpg brief.txt notizen.txt skript.sh? – genau ein Zeichen
Abschnitt betitelt „? – genau ein Zeichen“? steht für genau ein beliebiges Zeichen:
# Angenommen: log1.txt log2.txt log3.txt logA.txt run.sh sind vorhanden
echo log?.txt# log1.txt log2.txt log3.txt logA.txt
echo ???.sh# run.sh (genau 3 Zeichen vor .sh)[...] – ein Zeichen aus einer Menge
Abschnitt betitelt „[...] – ein Zeichen aus einer Menge“Eckige Klammern definieren eine Zeichenklasse – es passt genau ein Zeichen aus der angegebenen Menge:
# Angenommen: log1.txt log2.txt log3.txt logA.txt logB.txt sind vorhanden
echo log[13].txt# log1.txt log3.txt (nur 1 und 3)
echo log[1-3].txt# log1.txt log2.txt log3.txt (Bereich 1 bis 3)
echo log[!0-9].txt# logA.txt logB.txt (! negiert: kein Zeichen aus 0-9)Zeichenklassen funktionieren auch mit Buchstaben und gemischten Mengen:
# Angenommen: main.c util.c parser.h config.h sind vorhanden
echo *.[ch]# config.h main.c parser.h util.cPOSIX-Zeichenklassen
Abschnitt betitelt „POSIX-Zeichenklassen“Vordefinierte Klassen in der Form [:name:] stehen für ganze Zeichenkategorien:
# Angenommen: bericht.txt README.md logA.txt 01-intro.md 02-basics.md sind vorhanden
echo *[[:upper:]]*# README.md logA.txt (enthält mindestens einen Großbuchstaben)
echo [[:digit:]]*# 01-intro.md 02-basics.md (beginnt mit einer Ziffer)Häufig verwendete POSIX-Klassen:
| Klasse | Bedeutung |
|---|---|
[:upper:] | Großbuchstaben A-Z |
[:lower:] | Kleinbuchstaben a-z |
[:alpha:] | Alle Buchstaben |
[:digit:] | Ziffern 0-9 |
[:alnum:] | Buchstaben und Ziffern |
[:space:] | Leerzeichen, Tab, Newline |
Verzeichnisse und versteckte Dateien
Abschnitt betitelt „Verzeichnisse und versteckte Dateien“Verzeichnisse
Abschnitt betitelt „Verzeichnisse“* erfasst Verzeichnisse genauso wie Dateien – der Name erscheint ohne besondere Kennzeichnung in der Ausgabe:
echo *# bild.jpg brief.txt dokumente notizen.txt skript.sh# ^^^^^^^^^# Verzeichnis, sieht aus wie eine DateiOb ein Treffer eine Datei oder ein Verzeichnis ist, entscheidet nicht der Glob, sondern der Befehl, der die Liste verarbeitet.
Versteckte Dateien
Abschnitt betitelt „Versteckte Dateien“Dateien und Verzeichnisse, deren Name mit . beginnt, gelten unter Linux als versteckt und werden von Globs standardmäßig nicht erfasst – der Punkt muss explizit angegeben werden:
echo *# bild.jpg brief.txt dokumente notizen.txt skript.sh# (.bashrc, .profile, .ssh/ bleiben unsichtbar)
echo .*# .bash_history .bashrc .profile .ssh
echo .b*# .bash_history .bashrcKein Treffer
Abschnitt betitelt „Kein Treffer“Wenn kein Dateiname auf das Muster passt, lässt die bash das Muster standardmäßig unverändert stehen:
echo *.xyz# *.xyz ← kein Treffer: das Muster bleibt literalQuoting verhindert Expansion
Abschnitt betitelt „Quoting verhindert Expansion“Wie bei Substitutionen verhindern Anführungszeichen die Expansion:
echo "*.txt" # *.txt ← doppelt: kein Glob, Variablen-Substitution wirkt nochecho '*.txt' # *.txt ← einfach: alles wörtlichecho \*.txt # *.txt ← Backslash escaped das einzelne ZeichenGlobs sind keine regulären Ausdrücke
Abschnitt betitelt „Globs sind keine regulären Ausdrücke“Glob-Muster sehen regulären Ausdrücken ähnlich, funktionieren aber anders:
| Glob | Regex-Äquivalent | Bedeutung |
|---|---|---|
* | .* | beliebig viele Zeichen |
? | . | genau ein Zeichen |
[abc] | [abc] | ein Zeichen aus der Menge |