VMware ESXi and vSphere Cluster Management

Wildcards in Linux: Platzhalter im Terminal verwenden

Lerne Wildcards und Globbing in Linux kennen: ?, *, Zeichenklassen, Pfade, versteckte Dateien sowie sichere Nutzung mit ls, cp, mv und rm.

Mit Wildcards kannst du im Linux-Terminal mehrere Dateinamen über ein gemeinsames Muster auswählen. Das ist praktisch, wenn du Dateien anzeigen, kopieren, verschieben oder löschen möchtest.

Eine Wildcard ist ein Platzhalterzeichen in einem Muster. Die Shell ist der Kommandointerpreter, der deine Eingabe verarbeitet. Bevor ein Programm wie ls, cp, mv oder rm startet, erweitert die Shell ein passendes Dateimuster normalerweise zu einer Liste von Pfadnamen. Diese Erweiterung heißt Globbing.

Voraussetzungen und Beispieldateien

Für die Beispiele solltest du wissen, wie du mit pwd, cd und ls navigierst und Dateien sowie Pfade grundsätzlich erkennst. Lege zunächst eine kleine Testdateiliste an:

touch Oind Okhd Oerd Oereed Oad Ocd Od Oarmeerrd notiz.txt

Die Namen bilden die Grundlage für alle folgenden Vergleiche:

Oind
Okhd
Oerd
Oereed
Oad
Ocd
Od
Oarmeerrd
notiz.txt

Die wichtigsten Wildcards

SymbolBedeutungBeispielmusterPassende BeispieleNicht passende Beispiele
?Genau ein beliebiges ZeichenO??dOind, Okhd, OerdOad, Od, Oereed
*Null, ein oder beliebig viele ZeichenO*dOd, Oad, Oindnotiz.txt
[abc]Genau ein Zeichen aus der angegebenen MengeO[ac]dOad, OcdObd, Oacd
[a-e]Genau ein Zeichen aus dem Bereich von a bis eO[a-e]dOad, OcdOind, Od

Das Fragezeichen: genau ein Zeichen

Das Fragezeichen ? steht für genau ein beliebiges Zeichen innerhalb eines Dateinamens. Ein Muster mit festem Anfang, festen Zwischenzeichen und festem Ende verlangt daher eine exakt passende Länge.

Im Muster O??d bedeuten die Bestandteile:

  • O: Der Name muss mit dem Großbuchstaben O beginnen.
  • ??: Danach müssen genau zwei beliebige Zeichen folgen.
  • d: Der Name muss mit dem Kleinbuchstaben d enden.
ls -- O??d

Das findet:

Oind
Okhd
Oerd

Oad passt nicht, weil zwischen O und d nur ein Zeichen steht. Od passt ebenfalls nicht, weil dort kein Zwischenzeichen vorhanden ist. Oereed passt nicht, weil es vier statt zwei Zwischenzeichen enthält.

? ersetzt niemals eine leere Zeichenfolge. Für eine variable Anzahl von Zeichen verwendest du *.

Der Stern: null oder beliebig viele Zeichen

Der Stern * steht für null, ein oder beliebig viele Zeichen. Dadurch ist er weniger genau als ?.

Das Muster O*d zerfällt in:

  • O: fester Anfang
  • *: beliebig viele Zeichen, auch kein Zeichen
  • d: festes Ende
ls -- O*d

Dieses Muster findet alle folgenden Namen aus der Beispieldateiliste:

Oind
Okhd
Oerd
Oereed
Oad
Ocd
Od
Oarmeerrd

Besonders wichtig ist Od: Zwischen O und d steht nichts, und genau das darf * darstellen. O??d würde diesen Namen dagegen nicht finden.

Zeichenklassen mit eckigen Klammern

Eckige Klammern bilden eine Zeichenklasse. Sie wählen genau ein Zeichen aus einer festgelegten Menge oder einem Bereich aus.

Einzelne Zeichen angeben

Bei O[ac]d darf an der Stelle der Zeichenklasse entweder a oder c stehen:

ls -- O[ac]d

Die Treffer sind Oad und Ocd. Ein Name wie Obd passt nicht. Auch Oacd passt nicht, weil die Zeichenklasse genau ein Zeichen ersetzt und nicht einen längeren Teil des Namens.

Zeichenbereiche verwenden

Mit [a-e] wird ein Bereich angegeben. Er umfasst ein Zeichen aus a, b, c, d oder e. Das Muster O[a-e]d verlangt also genau ein solches Zeichen zwischen O und d.

ls -- O[a-e]d

In unserer Dateiliste passen Oad und Ocd. Weitere Treffer wären möglich, wenn beispielsweise Obd oder Oed existieren würden.

Zeichenklassen können einzelne Zeichen und Bereiche kombinieren. Das Muster [a-ce] bedeutet: a, b, c oder e. Der Bereich a-c und das einzelne Zeichen e werden dabei kombiniert.

Muster lesen und Treffer bestimmen

Beim Lesen eines Musters hilft diese Reihenfolge: Zerlege es in feste Zeichen, variable Teile und das feste Ende. Vergleiche anschließend Länge und Zeichenpositionen mit jedem Dateinamen.

DateinameO??dO*dO[ac]dO[a-e]d
OindJaJaNeinNein
OkhdJaJaNeinNein
OerdJaJaNeinNein
OereedNeinJaNeinNein
OadNeinJaJaJa
OcdNeinJaJaJa
OdNeinJaNeinNein
OarmeerrdNeinJaNeinNein
notiz.txtNeinNeinNeinNein

Expansion mit Linux-Befehlen einsetzen

Die Shell ersetzt ein Muster durch die passenden Namen. Findet ein Muster mehrere Dateien, erhält der Befehl mehrere Argumente.

Dateien mit ls anzeigen

ls ist der sicherste erste Test, weil du damit nur eine Übersicht erzeugst:

ls -- *.txt
ls -- bericht-?.txt
ls -- O*d

Die Schreibweise -- markiert das Ende der Optionen. Dadurch werden Namen, die mit einem Bindestrich beginnen, nicht versehentlich als Optionen interpretiert.

Dateien mit cp kopieren

Mit cp kannst du mehrere Treffer in ein Zielverzeichnis kopieren:

cp -- *.txt sicherung/

Das Muster wird beispielsweise zu mehreren Textdateien erweitert. Das Zielverzeichnis muss existieren, und bei mehreren Quelldateien muss das letzte Argument ein Verzeichnis sein.

Dateien mit mv verschieben oder umbenennen

mv verschiebt Dateien. Im folgenden Beispiel werden Dateien mit genau einem Zeichen nach dem Bindestrich ausgewählt:

mv -- bericht-?.txt archiv/

Mit mehreren Treffern verschiebt mv alle ausgewählten Dateien in das Zielverzeichnis. Eine einzelne Datei kann mit mv alt.txt neu.txt auch umbenannt werden.

Dateien mit rm löschen

rm ist destruktiv. Prüfe die Expansion deshalb immer vorher:

ls -- *.tmp
printf '%s\n' -- *.tmp
rm -- *.tmp

Führe den letzten Befehl nur aus, wenn die angezeigte Trefferliste vollständig und korrekt ist. Ein breites Muster wie * kann sehr viele Dateien erfassen. Auch *.log kann mehr Protokolldateien auswählen als beabsichtigt.

Expansion mit printf eindeutig prüfen

printf zeigt jedes expandierte Argument in einer eigenen Zeile:

printf '%s\n' -- O*d

Das ist besonders hilfreich, bevor du cp, mv oder rm ausführst. Prüfe zusätzlich dein aktuelles Verzeichnis:

pwd

So stellst du sicher, dass das Muster im erwarteten Verzeichnis ausgewertet wird.

Wildcards in Pfaden

Wildcards können auch in einzelnen Pfadbestandteilen stehen. Das Muster logs/*.txt wählt Textdateien im Verzeichnis logs aus:

ls -- logs/*.txt
cp -- logs/*.txt sicherung/

Ein Schrägstrich trennt Pfadsegmente. * oder ? ersetzen innerhalb eines Segments keinen Schrägstrich. Das Muster logs/*.txt erfasst daher Dateien direkt in logs, nicht automatisch Dateien in Unterverzeichnissen wie logs/alt/.

Versteckte Dateien und führende Punkte

Eine versteckte Datei ist eine Datei, deren Name mit einem Punkt beginnt, zum Beispiel .config. Ein normales * erfasst solche Namen üblicherweise nicht:

ls -- *

Für versteckte Einträge werden häufig diese Muster verwendet:

ls -- .[!.]* .??*

.[!.]* findet Namen, die mit einem Punkt beginnen, danach ein Zeichen besitzen, das kein Punkt ist, und anschließend beliebig weitergehen darf. .??* verlangt mindestens zwei Zeichen nach dem führenden Punkt. Beide Muster vermeiden die speziellen Einträge . und .. unter den üblichen Shell-Regeln.

Quoting: Anführungszeichen verhindern Globbing

Quoting bezeichnet das gezielte Verwenden von Anführungszeichen, um die besondere Bedeutung von Zeichen zu beeinflussen. Setzt du ein Muster in einfache oder doppelte Anführungszeichen, führt die Shell normalerweise keine Wildcard-Expansion durch.

printf '%s\n' '*.txt'
printf '%s\n' *.txt

Der erste Befehl gibt den Text *.txt wörtlich aus. Beim zweiten Befehl wird *.txt zu den passenden Dateinamen erweitert. Entferne die Anführungszeichen also nur dann, wenn die Shell das Muster auswerten soll.

Was passiert bei keinem Treffer?

Wenn kein Dateiname zu einem Muster passt, hängt das Verhalten von der Shell und ihren Einstellungen ab. In vielen Bash-Konfigurationen bleibt das Muster unverändert und wird als wörtlicher Text an den Befehl übergeben:

printf '%s\n' -- kein-treffer-*

In Bash kannst du optional nullglob aktivieren. Dann wird ein nicht passendes Muster zu einer leeren Liste:

shopt -s nullglob

Mit failglob erzeugt Bash stattdessen einen Shell-Fehler, wenn kein Treffer existiert:

shopt -s failglob

Diese Optionen verändern das Verhalten deiner Shell-Sitzung. Verlasse dich bei riskanten Befehlen trotzdem nicht allein darauf, sondern prüfe die Treffer explizit.

Sicherheitsregeln für Wildcards

ZielPrüfbefehlAusführender BefehlRisiko beziehungsweise Hinweis
Anzeigenls -- *.txtls -- *.txtUngefährlich, aber auf das richtige Verzeichnis achten.
Kopierenprintf '%s\n' -- *.txtcp -- *.txt sicherung/Mehrere Treffer werden als mehrere Quellen übergeben.
Verschiebenls -- bericht-?.txtmv -- bericht-?.txt archiv/Ziel und Trefferliste genau kontrollieren.
Löschenprintf '%s\n' -- *.tmprm -- *.tmpDestruktiv; breite Muster können unerwartet viele Dateien erfassen.
  1. Prüfe mit pwd, in welchem Verzeichnis du arbeitest.
  2. Zeige die Treffer mit ls -- muster oder printf '%s\n' -- muster an.
  3. Fasse das Muster enger, wenn mehr Treffer erscheinen als erwartet.
  4. Verwende für wichtige Aktionen möglichst einen eindeutigen Pfad.
  5. Führe erst danach cp, mv oder rm aus.

Typische Probleme und Lösungen

Ein Muster findet keine ähnlich benannte Datei

Wahrscheinlich stimmt die Anzahl der Fragezeichen nicht mit der Anzahl der Zeichen überein. Vergleiche Dateiname und Muster mit ls oder printf. Verwende bei variabler Länge * oder passe die Anzahl der ? an.

Eine versteckte Datei erscheint nicht

ls * erfasst normalerweise keine Namen mit führendem Punkt. Prüfe mit ls -la, ob der Name tatsächlich versteckt ist, und verwende anschließend bewusst ein Muster wie .[!.]* oder .??*.

Der Befehl erhält wörtlich *.txt

Das Muster steht vermutlich in Anführungszeichen. Vergleiche:

printf '%s\n' '*.txt'
printf '%s\n' *.txt

Entferne die Anführungszeichen, wenn Globbing gewünscht ist.

Ein Löschbefehl erfasst zu viele Dateien

Der Stern ist möglicherweise zu allgemein, oder du befindest dich im falschen Verzeichnis. Prüfe zuerst pwd und danach die Expansion mit printf '%s\n' -- muster. Fasse das Muster enger oder nutze einen vollständigen Pfad.

Ein nicht passendes Muster bleibt als Text stehen

Das ist häufig das Standardverhalten der verwendeten Shell. Teste es mit printf '%s\n' -- kein-treffer-*. In Bash kannst du bei Bedarf nullglob oder failglob gezielt aktivieren.

Ein Zeichenbereich liefert unerwartete Ergebnisse

Bereiche wie [a-z] können durch Locale- und Sortiereinstellungen beeinflusst werden. Prüfe die Einstellung mit:

locale

Für eindeutig kontrollierte Fälle kannst du einzelne zulässige Zeichen explizit angeben, etwa [abc], oder die gewünschte Locale dokumentieren.

Prüfungsrelevante Merksätze

  • Globbing geschieht normalerweise durch die Shell, bevor das Programm startet.
  • ? steht für genau ein Zeichen.
  • * steht für null oder beliebig viele Zeichen.
  • Eine Zeichenklasse wie [a-e] steht für genau ein Zeichen aus dem angegebenen Bereich.
  • Ein Schrägstrich wird nicht durch * oder ? innerhalb desselben Pfadsegments ersetzt.
  • Normales * erfasst üblicherweise keine führenden Punkte.
  • Anführungszeichen verhindern die Wildcard-Expansion.
  • Vor cp, mv und besonders rm immer zuerst die Trefferliste prüfen.

Wenn du Dateinamen sicher nach festen und variablen Teilen auswählen möchtest, beginne mit einem engen Muster, prüfe dessen Expansion und führe erst danach die gewünschte Dateioperation aus.