Tipp: Bash Globbing
*
- kein Zeichen oder beliebig viele Zeichen?
- genau ein Zeichen[]
- eines der Zeichen, dass innerhalb der Klammer angegeben ist
Damit steht also der *
für alles was vorkommen kann zusammen mit
anderen Zeichen lassen sich damit dann Suchmuster wie folgt bilden:
user@linux $ ls Linux*Essentials*
Linux-Essentials.txt
Linux-Essentials.asciidoc
Linux-Essentials.html
Dabei dieses, wie auch die anderen Suchzeichen, innerhalb der Suche beliebig oft benutzt werden.
Ein Beispiel für das ?
wäre, wenn z. B. nur alle Dateien mit
einer Endung aus drei Zeichen gesucht wird:
user@linux $ ls Linux-Essentials.???
Linux-Essentials.txt
Die Dateien mit den Endungen .asciidoc
und .html
werden nicht angezeigt, da sie
nicht nach dem Punkt (.
) noch weiter drei Zeichen haben.
Um einiges interessanter sind die Zeichenklassen oder
Zeichenbereiche, die durch die Klammern ([]
) eingeschlossen
werden. Auch wenn sich in den Klammern mehr als ein Zeichen
befindet, wird die Klammer als solches immer nur als Platzhalter
für ein Zeichen gesehen. Im einfachsten Fall enthält die Klammer
nur die Zeichen, die passen sollen.
user@linux $ ls Linux-Essentials.[at]*
Linux-Essentials.txt
Linux-Essentials.asciidoc
Das vorangehende Beispiel listet damit alle Dateien, die mit
Linux-Essentials.
beginnen und danach den Buchstaben a
oder t
haben. Darauf dürfen durch den *
beliebige andere Zeichen folgen.
Um das Ganze interessanter zu machen lassen sich aber auch Bereiche
wie z. B. a-z
, a-Z
oder 0-9
nutzen. Es sind dann alle Zeichen
innerhalb des Bereichs gemeint ohne das Zeichen -
, das nur zur
Kennzeichnung des Bereiches dient. Probieren wir es mal aus:
user@linux $ ls [a-Z]inux-Essentials.txt
Linux-Essentials.txt
Kombinieren lassen sich diese Bereiche natürlich auch. Beispiele
hierfür: [0-9a-Z]
oder [012a-m]
Schwierig wird es, wenn in einem Bereich die Zeichen ]
oder -
vorkommen sollen. Da diese selber zu den Sonderzeichen gehören muss
das Zeichen ]
das erste Zeichen nach dem [
sein. Wohingegen der
-
das letzte Zeichen vor dem schließenden ]
sein muss. Auch hier
ein Beispiel: []a-z-]
Es werden die Buchstaben a-z
und die
Zeichen ]
und -
gesucht.
Aber bei zu den Bereichen ist noch nicht alles gesagt. Es existieren noch die Klassen. Diese sind Abkürzungen für gängige Zeichenfolgen.
user@linux $ ls [[:alpha:]]inux-Essentials.txt
Linux-Essentials.txt
Die Klasse [:alpha:]
stellt alle Zeichen von a-Z
dar.
[:digit:]
die Ziffern von 0-9
.
Darüber hinaus gibt es noch eine Menge mehr Klassen, die in der
Manual Page zur Bash (man 1 bash
) beschrieben sind.
Zu guter letzt lassen sich die Klassen und Bereiche noch negieren.
Das bedeutet, dass das Suchmuster nur dann trifft, wenn die in der
Klammerung angegebenen Zeichen ’nicht’ gefunden werden. Um die
Negierung zu definieren wird direkt hinter der öffnenden Klammer
ein !
eingefügt. In der Bash kann dies auch durch ein ^
direkt
hinter der öffnenden Klammer geschehen.
user@linux $ ls [!a-z]inux-Essentials.txt
Linux-Essentials.txt
Falls das Zeichen ]
innerhalb der Klammern bei einer Negierung
als Suchmuster angegeben werden soll, dann folgt es nicht der
öffnenden Klammer, sondern dem Zeichen !
oder ^
.
Soweit die Möglichkeiten, wie sie die Posix Shell wie z. B. die
dash
(man 1 dash
) bietet.
Die Bash kann darüber hinaus auch noch Suchmuster gruppieren. Damit lassen sich dann komplexere Konstrukte aufbauen:
user@linux $ ls +([a-Z-]).txt
Linux-Essentials.txt
Den Bereich für die Zeichen a-Z
und zusätzlich den -
kennen wir
bereits. Diesmal kommt zusätzlich eine Klammerung mit runden
Klammern und einem vorangestellen +
ins Spiel.
Statt nun nach dem Bereich nur einmal zu suchen, wird nun der Bereich mindestens einmal gesucht. Falls das nächste Zeichen auch wieder auf den Bereich passt wird es zum Suchergebnis ergänzt und das solange, bis ein Zeichen nicht mehr auf den Bereich passt.
Neben dem +
gibt es noch weitere Zusammenfügungen:
?(Pattern)
kann einmal vorkommen, muss aber nicht+(Pattern)
muss einmal vorkommen, kann beliebig oft vorkommen*(Pattern)
muss nicht vorkommen, kann beliebig oft vorkommen@(Pattern)
muss genau einmal vorkommen!(Pattern)
darf nicht vorkommen
Innerhalb der Pattern können noch Alternativen angegeben werden,
die sich durch |
von einander trennen lassen. Die dadurch
entstehenden Konstrukte kommen den Regulären Ausdrücken schon recht
nah.
Durch einen Parameter der Shell lassen sich diese erweiterten
Globbings auch ein- oder ausschalten. Wenn die Option aktiv ist,
findet sich der Parameter extglob
in der Variable BASHOPTS
.
user@linux $ echo "${BASHOPTS}"
cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:interactive_comments:login_shell:progcomp:promptvars:sourcepath
Aktivieren lässt er sich über set -o extglob
und deaktivieren
über set +o extglob
.
Der set
Befehl der Bash hilft uns aber auch zu verstehen wie die
Bash mit den Suchen umgeht. Man könnte sich vorstellen, dass
Befehle wie der in den Beispiel benutzte Befehl ls
selber für die
Auswertung der Suchmuster und die Suche nach den Dateien zuständig
ist. Dem ist nicht so. Die Bash führt die Suche durch und gibt
ersetzt dann das Suchmuster mit den gefundenen Datei- und
Verzeichnisnamen.
Nehmen wir nochmal das erste Beispiel:
user@linux $ ls Linux*Essentials*
Linux-Essentials.txt
Linux-Essentials.asciidoc
Linux-Essentials.html
Über den Befehl set
lassen wir uns nun zeigen wie der Befehl
ausgeführt wird:
user@linux $ set -xv
user@linux $ ls Linux*Essentials*
ls Linux*Essentials.*
+ ls --color=auto Linux-Essentials.asciidoc Linux-Essentials.html Linux-Essentials.txt
Linux-Essentials.txt
Linux-Essentials.asciidoc
Linux-Essentials.html
user@linux $ set +xv
Zuerst wird der eingegebene Befehl wiederholt und danach (in der
Zeile mit dem +
) der Befehl, der ausgeführt wird. Bei diesem
wurde das Suchmuster gegen die Dateien, auf die das Muster passte
ersetzt.
Dies passiert ‘immer’ dann, wenn Suchmuster im Spiel sind. Daher kann eigentlich jeder Befehl, der in der Lage ist mehr als eine Datei zu verarbeiten über Shell Globbing mit einer Auswahl an Dateien aufgerufen werden.
Sobald aber um die Suchmuster doppelte oder einfache
Anführungszeichen ("
, '
) genutzt werden ist das Globbing
abgeschaltet.
Weitere Informationen sind in der Manual Page zur Bash (man 1 bash
unter dem Stichpunkt “Pattern Matching” zu finden.