Globbing ist eine Technik in Unix-basierten Systemen wie Linux, die verwendet wird, um Dateinamen mithilfe von Platzhaltern zu erweitern oder zu „matchen“. Diese Platzhalter sind spezielle Zeichen oder Muster, die in der Shell verwendet werden, um mehrere Dateien oder Verzeichnisse zu spezifizieren, ohne sie einzeln angeben zu müssen.

Glob-Syntax in Linux

Es gibt mehrere Arten von Platzhaltern (Glob-Mustern), die in Linux verwendet werden können. Die gebräuchlichsten sind:

  • Asterisk (*)
  • Fragezeichen (?)
  • Eckige Klammern ([])
  • Negation innerhalb eckiger Klammern ([^]) oder ([!...])
  • Geschweifte Klammern ({})

Asterisk (*)

Die Klammern {} enthalten eine durch Komma getrennte Liste von Strings. Wenn die Shell auf eine solche Konstruktion stößt, wird sie in jede mögliche Kombination der angegebenen Strings expandiert.

Bash Beispiel
*.txt

Dies matcht alle Dateien im aktuellen Verzeichnis, die mit .txt enden. Folgende, beispielhafte Dateien, die gematcht werden können:

  • datei1.txt
  • notes.txt
  • README.txt
Bash Beispiel
doc*

Dies matcht alle Dateien, deren Name mit doc beginnt, gefolgt von null oder mehr beliebigen Zeichen. Folgende Dateien können damit beispielhaft gematcht werden:

  • doc
  • document
  • doc123
  • doctor_notes.txt

Wenn man "ls *.txt" in der Shell eingibt, interpretiert die Shell dieses Muster und ersetzt "*.txt" durch alle Dateien im aktuellen Verzeichnis, die mit ".txt" enden. Das ist äußerst nützlich, um z.B. eine Liste von Dateien zu bearbeiten oder anzuzeigen, ohne jede Datei einzeln angeben zu müssen.

Fragezeichen (?)

Das Fragezeichen steht für genau ein beliebiges Zeichen.

Bash Beispiel
data?.csv

Dies matcht alle Dateien, die mit data beginnen, gefolgt von genau einem weiteren Zeichen, und die auf .csv enden. Beispielhafte Dateien wären:

  • data1.csv
  • data2.csv
  • dataA.csv
  • dataNeu.csv
Bash Beispiel
file_?.txt

Dies matcht Dateien wie file_1.txt oder file_A.txt, aber nicht file_10.txt oder file__.txt, da diese Muster zwei Zeichen enthalten, währen ? nur eines verlangt.

Eckige Klammern ([])

Eckige Klammern ([]) werden verwendet, um eine Zeichenkette zu definieren. Innerhalb der Klammern kann man eine Reihe von Zeichen angeben, und die Shell matcht ein beliebiges Zeichen aus dieser Mengen.

Bash Beispiel
file[123].txt

Dies matcht Dateien wie file1.txt, file2.txt oder file3.txt.

Bash Beispiel
data[ab].log

Dies matcht dataa.log oder datab.log.

Hierbei handelt es sich um eine sogenannte Zeichenkette. Wenn man zum Beispiel [123] verwendet, wird die Shell nach Dateien suchen, bei denen an dieser Stelle entweder 1, 2 oder 3 steht. Nützlich, wenn man eine Auswahl von Zeichen erlauben möchte.

Negation innerhalb von Klammern ([^]) oder ([!…])

Durch die Negation kann man Dateien ausschließen, die bestimmte Zeichen an einer Stelle enthalten. Das wird durch ein ! oder ein ^ am Anfang der Zeichenklasse ausgedrückt.

Bash Beispiel
file[!a-c].txt

Dies matcht alle Dateien, die mit file beginnen, gefolgt von einem Zeichen, das nicht a, b oder c ist, und auf .txt enden. Beispielhafte Dateien, die matchen würden, wären in diesem Fall:

  • file1.txt
  • filed.txt
  • fileA.txt
Bash Beispiel
doc[^0-9].txt

Dies matcht docA.txt oder docZ.txt, aber nicht doc1.txt oder doc5.txt.

Durch Negation kann man Muster angeben, die bestimmte Zeichen explizit ausschließen. Dies ist besonders praktisch, wenn man mit einer großen Menge von Dateien arbeitet und nur solche matchen möchte, die bestimmten Kriterien nicht entsprechen.

Geschweifte Klammern ({})

Geschweifte Klammern werden verwendet, um mehrere Muster gleichzeitig zu spezifizieren. Dies ist nicht direkt Globbing, sondern wird als Brace Expansion bezeichnet, funktioniert aber nach einem ähnlichen Prinzip.

Bash Beispiel
file{1,2,3}.txt

Dies expandiert zu file1.txt, file2.txt und file3.txt.

Bash Beispiel
{*.txt,*.csv}

Dies matcht alle Dateien, die entweder mit .txt oder .csv enden.

Häufige Stolperfallen

Versteckte Dateien (`.dotfiles`) werden nicht automatisch erfasst

*.txt matcht keine Dateien, die mit . beginnen — .config.txt wird ignoriert. Das ist Absicht: Linux behandelt Punkt-Dateien als versteckt. Mit shopt -s dotglob (Bash) oder setopt dotglob (Zsh) änderst du das. Alternativ matcht .[!.]* versteckte Dateien explizit, ohne . und .. zu treffen.

`*` matcht nicht über Verzeichnisgrenzen hinweg

*.txt findet nur .txt-Dateien im aktuellen Verzeichnis, nicht in Unterordnern. Für rekursives Matching brauchst du Globstar: shopt -s globstar aktivieren, dann findet **/*.txt alle .txt im Baum. Ohne Globstar bleibt nur find . -name "*.txt".

Ohne Treffer wird das Pattern wörtlich übergeben

Existiert keine .bak-Datei, dann läuft rm *.bak als rm '*.bak' — und rm meldet No such file or directory. In Skripten kann das katastrophale Folgen haben, wenn der wörtliche String unbeabsichtigt etwas matcht. Mit shopt -s nullglob expandiert das Pattern bei keinem Treffer zu nichts (leere Argumentliste), mit failglob bricht die Shell sofort ab.

Quotes deaktivieren Globbing komplett

ls "*.txt" sucht nach einer Datei, die exakt *.txt heißt — der Stern ist literal. Das ist bei find häufig gewünscht (find . -name "*.txt", weil find selbst expandiert), bei ls selten. Verwirrend wird's bei Variablen: pat="*.txt"; ls $pat (ohne Quotes) expandiert, ls "$pat" nicht.

Reihenfolge der Treffer ist locale-abhängig

Bash sortiert Glob-Ergebnisse nach Locale. Bei LC_COLLATE=de_DE.UTF-8 werden Großbuchstaben und Kleinbuchstaben gemischt, bei LC_COLLATE=C getrennt. Skripte, die sich auf eine bestimmte Reihenfolge verlassen, sollten LC_ALL=C setzen — oder die Liste explizit mit sort durchschieben.

Extended Globs müssen aktiviert werden

Pattern wie !(muster), *(muster) oder +(muster) sind nicht standardmäßig aktiv. In Bash ist shopt -s extglob Pflicht. Erst dann matcht !(*.bak) alles außer .bak-Dateien. Zsh aktiviert ähnliches mit setopt EXTENDED_GLOB und nutzt eine eigene Syntax (^*.bak, *.txt~*.bak).

Weiterführende Ressourcen

Externe Quellen

  • Brace Expansion{a,b,c} als verwandtes Konzept
  • Quoting — wann Globs deaktiviert werden
  • Shell — Grundlagen der Expansion-Reihenfolge
  • Variablen — Pattern in Variablen sicher verwenden
  • Manpagesman 7 glob für die Spezifikation
/ Weiter

Zurück zu Grundlagen

Zur Übersicht