globbing



Befehle wie diesen,

cp *.txt *.html blabla/

haben wir schon verwendet. Er würde alle Files die auf ".txt" oder ".html" enden ins Verzeichnis "blabla" kopieren. Das Duchen aller Files, die mit ".txt" enden macht aber nicht das "cp" Programm, sondern das macht die Shell. Diese ersetzt den Ausdruck "*.txt" durch die Namen aller Files die auf ".txt" enden ("matchen") und ruft das "cp" Programm dann mit diesen Namen auf.

Wir können uns das anschauen, indem wir "echo" verwenden um alle Argumente auszugeben:

echo *.txt

Dieser Befehl gibt die Namen aller Files aus, die auf ".txt" enden. (die Shell ruft das "echo" Programm genau mit diesen Argumenten auf).

Dieses Ersetzen der "wildcard" Ausdrücke nennt man "globbing". Die Ausdrücke sind allerdings nicht so mächtig wie die "regular expressions" die wir bei "grep" kennengelernt haben.

echo [abc]*.txt

...würde alle Files finden, die mit "a" "b" oder "c" beginnen und auf ".txt" enden.

echo [a-h]*[i]*.txt

... würde alle Files matchen, die mit "a","b","c","d","f","g" oder "h" beginnen, irgendwo im Namen ein "i" haben und auf ".txt" enden.

echo *.{txt,html,jpg}

... würde alle Files finden, die entweder auf "txt" auf "html" oder auf "jpg" enden. Das Matchen geht allerdings nicht nur auf den Dateinamen sondern auch auf Verzeichnisse:

echo /home/*/.bash_profile

... gibt die Namen aller ".bash_profiles" aller User an (vorausgesetzt du hast Lesebrechtigung auf ihre Home-Verzeichnisse)

Das Globbing ist also doch ziemlich leistungsfähig. Der kommende Befehl "command subtitution" hat jedoch deutlich erweiterete Funktionen.


EXERCISES:

* welches Programm ist für das Expandieren der Wildcards zuständig?

* teste das Shell-"globing" mit dem "echo"-Befehl

REFERENCES:

man bash (nach "Pattern Matching" suchen)

info bash