Linux‑Wildcards: Globbing verständlich erklärt

Schnellzugriff
Was sind Wildcards?
Ein einzelnes Zeichen spezifizieren: ?
Mehrere Zeichen mit * matchen
Zeichenbereiche mit eckigen Klammern
Alternativen mit geschwungenen Klammern und Klammern
Ausschlüsse mit ! und ^
Platzhalter abschalten mit Quoting
Was sind Wildcards?
Wildcards sind Shell-Metazeichen, die für eine oder mehrere Zeichen stehen können. Sie vereinfachen die Arbeit im Terminal, indem sie Listen von Dateinamen erzeugen, die dann an Programme übergeben werden. Wichtig: Die Shell wertet Wildcards aus und ersetzt sie durch die passenden Dateinamen, bevor ein Programm (z. B. ls, grep, cp) aufgerufen wird. Das Programm selbst sieht die Wildcards nicht.
Kurz definiert: Globbing ist das Ersetzen eines Musters durch die passenden Pfadnamen.
Hinweis zur Kompatibilität: Nicht alle Shells unterstützen jedes erweiterte Muster. ?, und [] sind weit verbreitet. Erweiterte Muster wie * (rekursiv) oder Alternativen in Klammern werden in modernen Shells wie zsh und in Bash mit aktivierter “extended globbing” unterstützt.
Wichtige Begriffe in einer Linie:
- Shell: das Programm (z. B. bash, zsh), das eingaben verarbeitet und Globs auflöst.
- Globbing: Musteraufweitung der Shell.
- Pattern: Das Wildcard-Muster, z. B. *.txt.
Ein einzelnes Zeichen spezifizieren: ?
Das Fragezeichen steht für genau ein beliebiges Zeichen außer dem Verzeichnis-Trennzeichen ‘/‘. Beispiele:
ls photo.0?.jpgDas matcht photo.001.jpg oder photo.012.jpg, aber nicht photo.01.jpg (weil dort nur eine Ziffer fehlt) und nicht photo.001.jpg in einem anderen Verzeichnis, da ‘/‘ nicht ersetzt wird.

Wenn kein Dateiname passt, hängt das Verhalten von Ihrer Shell-Einstellung ab: Entweder erhalten Sie eine Fehlermeldung (z. B. “no matches found” in zsh) oder die Shell übergibt das Muster unangetastet an das Programm (älteres Verhalten) oder zeigt nichts an. In Bash können Sie das Verhalten mit shopt einstellen.
Mehrere Zeichen mit * matchen
Der Stern (*) steht für null oder mehr Zeichen (außer ‘/‘). Er ist die wohl häufigste Wildcard:
ls *.jpgzeigt alle JPEGs im aktuellen Verzeichnis.

Beispiele:
ls photos/*.jpg
ls *.p?
ls *d*Rekursive Matches mit (bei zsh standardmäßig; in Bash mit Globstar aktivierbar via shopt -s globstar):
ls ~/ls /usr//bin
erklärt: In zsh durchsucht standardmäßig Unterverzeichnisse; in Bash sucht nur rekursiv, wenn die Option globstar aktiviert ist.
Die Konstruktion . aus MS‑DOS ist unter Linux unnötig: * allein matcht alles.
Vorsicht: destructive Kommandos mit Wildcards (z. B. rm) sind riskant. Testen Sie Muster vorher mit ls oder echo.
echo rm *.tmp # zeigt, welche Dateien betroffen wären
rm -i *.tmp # Nachfragen vor dem LöschenZeichenbereiche mit eckigen Klammern
Mit [ ] können Sie einzelne Zeichen oder Bereiche spezifizieren:
[abc] # a oder b oder c
[a-z] # alle Kleinbuchstaben
[A-Z] # alle Großbuchstaben
[0-9] # alle Ziffern
[a-zA-Z0-9] # alphanumerischKombiniert mit anderen Mustern:
ls *.p[ly] # matcht .pl und .py
ls file[0-9].txt
ls [!a-z]* # Dateien, die nicht mit Kleinbuchstaben beginnen
Beachten Sie: Ein führendes Ausrufezeichen (!) oder ein ^ direkt nach der öffnenden Klammer invertiert die Klasse (siehe Abschnitt Ausschlüsse).
Alternativen mit geschwungenen Klammern und Klammern
Es gibt zwei unterschiedliche Mechanismen, die oft verwechselt werden: geschwungene Klammern {a,b} sind für die Expansion auf Wortebene (Brace expansion) und werden von der Shell selbst erzeugt; sie sind keine Wildcards im engeren Sinn, sondern eine Liste von alternativen Wörtern:
echo {cat,dog}
# Ausgabe: cat dog
echo {a..d}
# Ausgabe: a b c d
echo {1..10}
# Ausgabe: 1 2 3 4 5 6 7 8 9 10Dagegen werden in manchen Shells Alternativen in Klammern mit dem senkrechten Strich (|) verwendet, dies ist typischerweise Teil erweiterter Globbing-Regeln (z. B. in zsh oder in Bash mit extglob):
ls *.(pl|py) # in zsh oder Bash mit extglob
ls +([0-9]) # +(... ) ist extglob-SyntaxErklärung einfacher extglob-Operatoren (bei aktivierter extglob in Bash oder in zsh):
- +(pattern) : mindestens einmal pattern
- *(pattern) : null oder mehrmals pattern
- ?(pattern) : null oder einmal pattern
- @(a|b) : genau a oder b
- !(pattern) : alles außer pattern
Wenn Sie extglob in Bash nutzen wollen, aktivieren Sie es mit:
shopt -s extglobAusschlüsse mit ! und ^
Innerhalb eckiger Klammern invertiert ein führendes ! oder ^ die Klasse:
ls [!a-z]
ls [^a-z]Das bedeutet: matcht Zeichen, die nicht Kleinbuchstaben sind.
In extglob kann man ganze Muster ausschließen:
ls !(a|b|c)Das matcht alle Einträge, die nicht a, b oder c entsprechen.
Platzhalter abschalten mit Quoting
Wenn Sie Wildcards nicht von der Shell auswerten lassen möchten (z. B. weil Sie ein Muster an grep weitergeben oder eine Zeichenkette mit * speichern wollen), nutzen Sie Quoting:
- Einzelne Anführungszeichen (‘) deaktivieren Expansion vollständig (auch Variablen werden nicht ersetzt).
- Doppelte Anführungszeichen (“) schützen die meisten Metazeichen, lassen aber Variablen- und Backtick-Expansion zu.
Beispiele:
grep '^foo' file.txt # ^ als Anfangsanker für grep, nicht als Negation für die Shell
pattern="foo.*bar"
grep "$pattern" file.txt # Variablen werden expandiert, Globs nicht
'Wenn Sie ein Muster exakt an ein Programm übergeben möchten, das selber Globs behandelt, quote es entsprechend.
Shell-spezifische Details und Optionen
Bash vs zsh: Beide Shells unterstützen die grundlegenden Globs (?, *, []). Unterschiede und Erweiterungen:
- zsh hat sehr mächtige Globbing-Features standardmäßig (z. B. für Rekursion, erweiterte Qualifier wie :e, :r zum Filtern nach Dateiendungen/typ).
- Bash unterstützt extglob und globstar, muss diese Optionen teils aktivieren:
# Bash: rekursives Globbing shopt -s globstar ls/*.md # Bash: erweiterte Muster shopt -s extglob ls !(node_modules|.git)
Qualifier in zsh (Beispiele):
- */.py(.N) # nur reguläre Dateien (kein Symlink) mit Prüfung
- ls */.jpg(N) # N = nullglob: kein Fehler, wenn keine Matches
Prüfen Sie die Dokumentation Ihrer Shell (man bash, man zsh), bevor Sie erweiterte Muster produktiv einsetzen.
Sicherheit und Vorsichtsmaßnahmen
Wildcards können mächtig und gefährlich sein. Praxisregeln:
- Vorschau immer mit echo oder ls, bevor Sie destructive Kommandos (rm, mv, cp) ausführen.
- Verwenden Sie rm -i oder setzen Sie eine sichere Alias-Policy: alias rm=’rm -i’.
- Arbeite in einem Testverzeichnis, wenn Sie komplexe Muster ausprobieren.
- Vermeide Globs, die leere Listen an rm übergeben; nutzen Sie -f mit Bedacht.
- Verwenden Sie absolute Pfade in Skripten, um Überraschungen durch unterschiedliche CWDs zu vermeiden.
Sicherheitsbeispiel:
# unsicher
rm *
# sicherer: prüfen
echo rm *
rm -i *Wichtig: Beim Arbeiten mit root-Rechten sind Fehler fatale. Legen Sie Backups an.
Gegenbeispiele und typische Fehlerfälle
Wann versagen Wildcards oder produzieren unerwartete Ergebnisse:
- Muster überschreitet Verzeichnisgrenze: und ? matchen niemals ‘/‘. Verwenden Sie * (mit globstar) für rekursive Suche.
- Versteckte Dateien (beginnend mit ‘.’) werden nicht von erfasst. Nutzen Sie . oder explizite Pattern.
- Locale/Encoding kann Zeichenklassen beeinflussen; [a-z] verhält sich je nach Locale unterschiedlich.
- Dateinamen mit ungewöhnlichen Zeichen (Leerzeichen, Zeilenumbruch, Steuerzeichen) können unerwartet gesplittet werden. Verwenden Sie null-terminierte Ausgaben (find -print0 | xargs -0).
Beispiel: versteckte Dateien kopieren
cp .* /backup/ # kann '.' und '..' beinhalten – Vorsicht!
# besser
shopt -s dotglob # Bash: * inkludiert jetzt Dateien, die mit . beginnen
cp -- * /backup/Alternative Werkzeuge und Kombinationen
Wildcard-Matching ist sehr praktisch, aber manchmal besser ergänzt durch:
- find: feingranulare Suche (zeit-, größen-, typbasiert) und sichere Handhabung mit -exec oder -print0
- grep: Filtert nach Inhalt
- rsync: Kopieren mit Filterregeln und Schutz gegen versehentliches Überschreiben
- fd / ripgrep: moderne Tools mit schneller Suche und sicheren Default-Optionen
Beispiel-Kombination:
find . -type f -name "*.log" -mtime +30 -print0 | xargs -0 rm -vSnippets und Cheat Sheet
Schnelle Referenz
? # genau ein Zeichen
* # null oder mehr Zeichen
[abc] # a oder b oder c
[a-z] # Bereich
[!0-9] # kein Ziffernzeichen
{a,b,c} # Brace expansion (Worte)
** # rekursiv (bei aktivierter globstar)
!(pattern) # extglob: alles außer patternPreview-Technik
echo rm *.tmp
ls -d -- *pattern*Aktivieren in Bash
shopt -s extglob globstar dotglobEntscheidungshilfe (Mermaid)
flowchart TD
A[Will ich rekursiv suchen?] -->|Ja| B{Verwendet zsh oder Bash+globstar}
B -->|Ja| C[** verwenden]
B -->|Nein| D[find oder rsync nutzen]
A -->|Nein| E[Standard-Globs '*, ?, []']
E --> F{Brauche ich Alternativen}
F -->|Ja| G[Brace expansion oder extglob]
F -->|Nein| H[Einfaches Muster]Role‑basierte Checklisten
Administrator
- Immer mit echo/vorherigem ls prüfen.
- Bei Massenlöschungen Backups erstellen.
- Globstar und extglob dokumentieren, wenn in Skripten verwendet.
Entwickler
- In Skripten stets set -u/-o errexit und explizite Pfade nutzen.
- Test-Umgebung verwenden, wenn komplexe Muster eingesetzt werden.
Skriptautor
- Verwende printf ‘%s\0’ und xargs -0 wenn möglich.
- Explizite Fehlerbehandlung: prüfen, ob Matches leer sind.
Kompatibilität und Migrationshinweise
- Bash (Version >= 4) unterstützt globstar und extglob, muss aber mit shopt aktiviert werden. Auf älteren Systemen prüfen.
- zsh bietet erweiterte Globbing-Features standardmäßig; Portierung von Skripten zwischen bash und zsh kann Anpassungen erfordern.
- Windows CMD/PowerShell verwenden andere Musterregeln; Skripte sind nicht portabel ohne Anpassung.
Kurzes Glossar
- Glob: Muster mit Wildcards zur Dateinamensauswahl.
- Brace expansion: Erzeugt mehrere Wörter aus {a,b} oder {1..10}.
- extglob: Erweiterte Globbing-Syntax in Bash/zsh für komplexe Muster.
Testfälle und Akzeptanzkriterien für Muster in Skripten
- Akzeptanzkriterium 1: Ein Muster darf kein ‘/‘ matchen, wenn nicht rekursiv gewünscht ist.
- Akzeptanzkriterium 2: Skript validiert, ob Matches vorhanden sind; bei keiner Übereinstimmung wird ein sinnvoller Fehler ausgegeben.
- Akzeptanzkriterium 3: Skript dokumentiert benötigte Shell-Optionen (z. B. extglob).
Testvorgehen:
- Erzeuge Testdateien mit verschiedenen Namen (Leerzeichen, Punkt, Unicode).
- Führe Muster aus und vergleiche gegen erwartete Liste.
Kurzbeispiele aus der Praxis
Erstelle Backups aller .conf-Dateien:
mkdir -p ~/backup/conf
cp /etc/*.conf ~/backup/conf/Entferne alle temporären Logfiles älter als 30 Tage:
find /var/log -type f -name "*.log" -mtime +30 -print0 | xargs -0 rm -vListe alle Python-Dateien rekursiv (Bash mit globstar):
shopt -s globstar
ls **/*.pyPrivacy und Sicherheitshinweise für Firmennetzwerke
- Vermeiden Sie das Ausführen von Wildcard-gestützten Befehlen in geteilten Verzeichnissen ohne Berechtigungsprüfung.
- Protokollieren Sie Massenoperationen (z. B. rsync/cp/rm) in Change-Logs.
- Benutzen Sie sichere, auditable Tools (rsync, git) statt unkontrollierter Massenlöschungen.
Faktenbox
- Grundlegende Wildcards: ?, * und [ ] funktionieren in praktisch allen Unix-Shells.
- Erweiterte Globs (extglob, globstar, **) sind Shell-abhängig und oft optional.
- Hidden files beginnen mit ‘.’ und werden von * nicht erfasst, sofern nicht dotglob gesetzt ist.
Zusammenfassung
Wildcards sind ein mächtiges Mittel für die Arbeit auf der Kommandozeile. Die Grundmuster ?, *, [ ] genügen für die meisten Aufgaben. Erweiterte Globbing-Optionen in Bash und zsh bieten zusätzliche Flexibilität, erfordern jedoch Aufmerksamkeit bei Sicherheit und Kompatibilität. Testen Sie Muster vorher mit echo oder ls und verwenden Sie in Skripten klare Dokumentation und Fallbacks.
Wichtig: Vorschau vor Destruktivoperationen, absichern von Skripten (Optionen dokumentieren) und bei Bedarf auf robuste Tools wie find oder rsync zurückgreifen.
Wenn Sie möchten, kann ich ein kurzes Cheatsheet im Druckformat erstellen, eine Version für Anfänger mit nur drei essenziellen Befehlen oder eine Ausgabe optimiert für zsh mit Beispielen zu Qualifiern.
Ähnliche Materialien
Podman auf Debian 11 installieren und nutzen
Apt-Pinning: Kurze Einführung für Debian
FSR 4 in jedem Spiel mit OptiScaler
DansGuardian + Squid (NTLM) auf Debian Etch installieren
App-Installationsfehler auf SD-Karte (Error -18) beheben