Antag att en viss katalog innehåller följande filer:$ ls
epistel23.text epistel28.text~ fredman.html~ haga.sång~
epistel25.text epistel36.text fredman.ps movitz.html
epistel28.text fredman.html haga.sång winblad.html
$Om vi nu vill radera alla filer vars namn slutar med ett
tildetecken
så kan vi ge kommandot rm epistel28.text~ fredman.html~ haga.sång~.
Men det känns lite omständligt att behöva räkna upp alla dessa filer.
Lyckligtvis finns det ett enklare sätt.
Man kan nämligen referera till flera filer
samtidigt med hjälp av jokertecken.
Jokertecknen är *, ? och [. Om ett argument innehåller något av dessa tecken, så tolkar skalet argumentet som ett mönster som ska paras ihop med namnen på filerna (och katalogerna) i den nuvarande katalogen. Om ett eller flera av filnamnen ''matchar'' mönstret så skriver skalet om kommandot man gav genom att byta ut mönstret mot en alfabetiskt sorterad lista av de filnamn som matchar mönstret. Om mönstret däremot inte matchas av något filnamn, så görs inga omskrivningar, utan skalet lämnar då mönstret som det är.
Jokertecknet * matchar
vilken som helst följd av noll eller flera tecken.
Mönstret *~ matchar därför precis de filnamn som slutar
med ett tilde.
För att radera alla filer vars namn slutar med tilde kan vi
tydligen ge kommandot rm *~. Detta kommando skriver skalet
(utan att det syns) om till rm epistel28.text~ fredman.html~ haga.sång~
innan det exekveras. Tolkningen görs alltså av skalet -
kommandon som tex rm vet ingenting om jokertecken.$ rm *~
$ ls
epistel23.text epistel36.text haga.sång
epistel25.text fredman.html movitz.html
epistel28.text fredman.ps winblad.html
$
I de följande exemplen, där vi inte gör något meningsfullt utan bara demonstrerar hur jokertecken fungerar, ska vi använda kommandot echo som ju skriver ut sina argument exakt som de är. Då får vi se hur argumenten såg ut efter omskrivningen.
Mönstret epistel* matchar alla de filer vars namn börjar med
''epistel'':$ echo epistel*
epistel23.text epistel25.text epistel28.text epistel36.text
$Så här väljer man ut alla filer vars namn slutar med .html:$ echo *.html
fredman.html movitz.html winblad.html
$Det finns ingen fil vars namn slutar med .htm:$ echo *.htm
*.htm
$Här ser vi att skalet skickar mönstret vidare oförändrat
ifall det inte matchar något filnamn.
Det får förekomma jokertecken i fler än ett av argumenten:$ echo winblad.* fredman.*
winblad.html fredman.html fredman.ps
$Man får också använda flera jokertecken i samma mönster:$ echo e*3*t
epistel23.text epistel36.text
$ echo *n*
fredman.html fredman.ps haga.sång winblad.html
$På detta sätt fann vi alla filnamn som innehåller bokstaven n.
Jokertecknet ? matchar ett (exakt ett) godtyckligt tecken.$ echo epistel2?.text
epistel23.text epistel25.text epistel28.text
$ echo *.??
fredman.ps
$Mönstret *.?? matchar de filer vars namn slutar
på en punkt följt av exakt två tecken.
Det finns två undantag mot reglerna för jokertecken.
Det ena undantaget är att
tecknet / måste anges uttryckligen i mönstret.
Så till exempel matchar mönstret
/etc/*wd filnamnet /etc/passwd
men inte filnamnet /et*wd.$ echo /et*wd
/et*wd
$ echo /etc/*wd
/etc/passwd
$ echo /usr/*/emacs
/usr/bin/emacs /usr/doc/emacs /usr/lib/emacs
$Det andra undantaget är att filnamn som inleds med en punkt
endast matchas av mönster som också inleds med en punkt.$ echo .*
. .. .bash_history .bash_profile .bashrc .inputrc
$ echo .ba*
.bash_history .bash_profile .bashrc
$
Om man vill att mönstret ska matcha bara vissa utvalda tecken,
så behövs andra hjälpmedel än * och ?,
nämligen [...].
Mellan hakparenteserna ska man räkna upp ett antal tecken,
och då tolkar skalet detta som ett mönster som matchar
ett (exakt ett) av de uppräknade tecknen.
Till exempel matchar [058] ett valfritt av tecknen 0, 5 och 8:$ echo epistel2[058].text
epistel25.text epistel28.text
$Man kan också ange intervall, [3-7] matchar 3, 4, 5, 6
eller 7, och [a-d] matchar a, b, c eller d.$ echo epistel2[3-7].text
epistel23.text epistel25.text
$ echo *.[a-r]*
fredman.html fredman.ps movitz.html winblad.html
$Om man vill att mönstret ska matcha alla tecken som inte
är uppräknade, så ska man ange tecknet ^ direkt
efter [. Mönstret [^te-h] matchar alltså exakt ett tecken
som inte är något av t,e,f,g eller h.$ echo *[^te-h]
fredman.html fredman.ps movitz.html winblad.html
$(Man kan använda ! som en synonym för ^.)
Låt oss avslutningsvis nämna en liten komplikation: Hur kan man ange ett mönster som
ska matcha exakt ett av tecknen 2, - och 5?
Inte som 2-5, för då tolkas det som 2,3,4 eller 5. Men om man sätter
tecknet - först eller sist, som i [-25], så förstår skalet
att man inte syftar på ett intervall. På motsvarande sätt
gäller att om man vill räkna upp ett antal
tecken varav ett är ], så ska man ange detta först.
Exempelvis matchar []aö] ett av tecknen
], a och ö.