- Mitglied seit
- 15. Mai 2008
- Beiträge
- 21.900
- Punkte für Reaktionen
- 14
- Punkte
- 0
In diesem Workshop geht es um das Pattern Matching mit Dateinamen (globbing on filenames).
Eine Fähigkeit der Shell ist es, Dateinamen durch ein Muster zu generieren. Hierfür gibt es sogenannte Wildcard (Joker), die eine Stelle '?' oder eine Folge von Stellen '*' in einen Dateinamen beliebig halten und von der Shell durch konkrete Dateinamen ersetzt (substituiert) werden. Beispiel:
Es gibt noch eine Notation für eine Zeichenstelle, wo man eine Gruppe von Zeichen vorgibt; die Notation wird an den Beispielen deutlich:
In der Gruppe kann man auch die Komplementärmenge/Negation durch das '!' ausdrücken:
Anmerkung: Bei einigen Shells geht neben dem '!' auch das '^'.
Bislang scheint es, als würde das Kommando 'ls' etwas mit der Mustergenerierung der Dateinamen zu tun haben. Das ist ein Trugschluss, denn alle Ausgaben kann man auch durch das Kommando 'echo' erzeugen:
Man könnte sogar das Kommando selbst durch ein Muster erzeugen lassen:
Für die Fehlersuche ist es manchmal wichtig, sich anzuschauen, wie die Shell ein Muster erzeugt, deswegen gibt es eine Option, welche man mit 'set -x' einschalten kann, die vor der Ausführung die Dateinamen-Ersetzung anzeigt:
Nun kann es sein, dass man statt einer Liste von Dateinamen einfach ein paar '*' mit dem echo ausgeben möchte. Da die Shell aber gnadenlos ist, muss man die '*' vor ihr schützen. Dazu gibt es Verfahren des Quotierens (Einschießen in Hochkomma) bzw. des Maskierens durch einen '\' (backslash).
Das gilt natürlich auch für '?' und '[...]' Konstruktionen, sobald sich Dateinamen bilden lassen. Deswegen sollte man immer Quotieren, damit man nicht aus Versehen ein Muster generiert. Jetzt wird vielleicht auch klar, warum ich Texte, die per echo ausgegeben werden, immer vorsorglich in einfache Hochkomma setze.
=======
Viel Spaß beim Experimentieren.
Itari
PS. set -x kann man mit set +x wieder ausschalten.
=========================================
Sinnvollerweise sind die Shell-Workshops aufeinander aufgebaut.
Shell-Workshop (4)
Shell-Workshop (6)
Eine Fähigkeit der Shell ist es, Dateinamen durch ein Muster zu generieren. Hierfür gibt es sogenannte Wildcard (Joker), die eine Stelle '?' oder eine Folge von Stellen '*' in einen Dateinamen beliebig halten und von der Shell durch konkrete Dateinamen ersetzt (substituiert) werden. Beispiel:
Rich (BBCode):
Syno> ls
a1 text1 text2 text3 text4 text99
Syno> ls text?
text1 text2 text3 text4
Syno> ls te*
text1 text2 text3 text4 text99
Syno> ls *1
a1 text1
Syno> ls ??
a1
Syno> ls ??????
text99
Es gibt noch eine Notation für eine Zeichenstelle, wo man eine Gruppe von Zeichen vorgibt; die Notation wird an den Beispielen deutlich:
Rich (BBCode):
Syno> ls text[134]
text1 text3 text4
Syno> ls text[1-4]
text1 text2 text3 text4
Syno> ls *[19]
a1 text1 text99
In der Gruppe kann man auch die Komplementärmenge/Negation durch das '!' ausdrücken:
Rich (BBCode):
Syno> ls text[!1]
text2 text3 text4
Anmerkung: Bei einigen Shells geht neben dem '!' auch das '^'.
Bislang scheint es, als würde das Kommando 'ls' etwas mit der Mustergenerierung der Dateinamen zu tun haben. Das ist ein Trugschluss, denn alle Ausgaben kann man auch durch das Kommando 'echo' erzeugen:
Rich (BBCode):
Syno> echo *
a1 text1 text2 text3 text4 text99
Man könnte sogar das Kommando selbst durch ein Muster erzeugen lassen:
Rich (BBCode):
Syno> *
-ash: a1: not found
Syno> a1 text1 text2 text3 text4 text99
-ash: a1: not found
Für die Fehlersuche ist es manchmal wichtig, sich anzuschauen, wie die Shell ein Muster erzeugt, deswegen gibt es eine Option, welche man mit 'set -x' einschalten kann, die vor der Ausführung die Dateinamen-Ersetzung anzeigt:
Rich (BBCode):
Syno> set -x
Syno> echo text[1-3]
+ echo text1 text2 text3
text1 text2 text3
Nun kann es sein, dass man statt einer Liste von Dateinamen einfach ein paar '*' mit dem echo ausgeben möchte. Da die Shell aber gnadenlos ist, muss man die '*' vor ihr schützen. Dazu gibt es Verfahren des Quotierens (Einschießen in Hochkomma) bzw. des Maskierens durch einen '\' (backslash).
Rich (BBCode):
Syno> echo '****'
+ echo ****
****
Syno> echo "****"
+ echo ****
****
Syno> echo \*\*\*\*
+ echo ****
****
Syno> echo "****" * '****'
+ echo **** a1 text1 text2 text3 text4 text99 ****
**** a1 text1 text2 text3 text4 text99 ****
Das gilt natürlich auch für '?' und '[...]' Konstruktionen, sobald sich Dateinamen bilden lassen. Deswegen sollte man immer Quotieren, damit man nicht aus Versehen ein Muster generiert. Jetzt wird vielleicht auch klar, warum ich Texte, die per echo ausgegeben werden, immer vorsorglich in einfache Hochkomma setze.
Rich (BBCode):
Syno> echo [*]
+ echo [*]
[*]
Syno> echo text[123]
+ echo text1 text2 text3
text1 text2 text3
Syno> echo text'[123]'
+ echo text[123]
text[123]
=======
Viel Spaß beim Experimentieren.
Itari
PS. set -x kann man mit set +x wieder ausschalten.
=========================================
Sinnvollerweise sind die Shell-Workshops aufeinander aufgebaut.
Shell-Workshop (4)
Shell-Workshop (6)
Zuletzt bearbeitet: