2.6. Joker-tegn, omdirigering og pipes

Vi vil i dette afsnit se på et par af systemets mere smarte funktioner, som gør livet lettere for dig som bruger.

2.6.1. Joker-tegnet

Forestil dig, at du har mange filer, som du gerne vil slette. Du kan naturligvis skrive rm filnavn for hvert enkelt navn, men bare med 5-10 filer bliver du hurtigt træt af det. Redningen er joker-tegnet. Lad os antage, at du har tre filer i et katalog, og at du gerne vil slette dem alle. Nedenfor ser du hvordan:

[tyge@hven MitKatalog]$ touch aaa abc ccc
[tyge@hven MitKatalog]$ ls
 aaa  abc   ccc  
[tyge@hven MitKatalog]$ rm *
[tyge@hven MitKatalog]$ ls
[tyge@hven MitKatalog]$

Alle filer er det samme som *. Hvis du i stedet havde skrevet a*, betyder det alle filer som begynder med a.

[tyge@hven MitKatalog]$ touch aaa abc ccc
[tyge@hven MitKatalog]$ ls
 aaa  abc   ccc
[tyge@hven MitKatalog]$ rm a*
[tyge@hven MitKatalog]$ ls
 ccc
[tyge@hven NytKatalog]$

Stjernen, også kaldet joker-tegnet, kan bruges overalt. F.eks. betyder a*b alle filer, der begynder med a og slutter på b, hvilket vil inkludere filerne ab, aDuErGodb, men ikke en fil med navnet abe. Joker-tegnet kan bruges sammen med alle de mest almindelige kommandoer i Linux. F.eks. viser nedenstående eksempel hvordan du viser alle filer, der begynder med 'ad' i kataloget /usr/bin:

[tyge@hven MitKatalog]$  ls /usr/bin/ad*
/usr/bin/addftinfo /usr/bin/addr /usr/bin/addr2line


Det er værd at bemærke, at jokertegn ekspanderes af kommandofortolkeren - ikke af applikationen. Det har bl.a. den store fordel, at jokertegn altid fungerer - og fungerer konsistent på tværs af applikationer.

Et meget simpelt eksempel: Et katalog indeholder 3 filer: fil1, fil2 og ccc. Skriver du: ls f*, vil kommandofortolkeren først ekspandere f* og derefter kalde ls med: ls fil1 fil2. Output fra ls f* er blot:

[tyge@hven MitKatalog]$  touch fil1 fil2
[tyge@hven MitKatalog]$  ls
ccc   fil1   fil2
[tyge@hven MitKatalog]$  ls f*
fil1   fil2
og ls laver således et yderst banalt arbejde.

Men der er flere muligheder i dette. Et eksempel: For at se forskellen mellem fil1 og fil2 kan du skrive: diff fil1 fil2. Men du kan også nøjes med at skrive: diff f* og således lade kommandofortolkeren ekspandere f* til fil1 fil2. Da de to filer er ens (de indeholder ingenting nogen af dem), så er der ingen forskel, og derfor intet at vise.

[tyge@hven MitKatalog]$  diff f*
[tyge@hven MitKatalog]$

Somme tider kan denne konsekvente ekspansion af joker-tegn dog være en ulempe.

Et tænkt eksempel: Et katalog indeholder 2 filer:

[tyge@hven film]$ ls
dogme95.zip      film_index.html

Du kan også bruge zip-filer under Unix, og du kan se indholdet af zip-filen ved f.eks. at skrive:

[tyge@hven film]$ unzip -v d*
Archive:  dogme95.zip
Length Method Size Ratio Date    Time   CRC-32   Name
------ ------ ---- ----- ----    ----   ------   ----
 14853 Defl:N 5224 65%  10-27-98 16:12 944a4af4 festen.html
 14844 Defl:N 5401 64%  11-14-98 19:53 e55c1636 idioterne.html
  1941 Defl:N 1024 47%  03-12-99 22:12 5ecb7d23 mifune.html
------       ----- ---                           -----
 31638       11649 63%                          3 files

Nu vil vi pakke festen.html ud af zip-filen. Det er den eneste fil i zip-filen, der starter med f, så under DOS kunne man blot skrive: unzip d* f*. Men prøver man det under Unix, går det galt:

[tyge@hven film]$unzip d* f*
Archive:  dogme95.zip
caution: filename not matched:  film_index.html

Hvorfor det? Fordi der i kataloget i forvejen ligger en fil, der matcher f*, så vil kommandofortolkeren ekspandere både d* og f* og kalde unzip med: unzip dogme95.zip film_index.html.

Du bliver som minimum nødt til at skrive: unzip d* fe*. Der er ingen fil i kataloget, der matcher fe*, så kommandofortolkeren vil kun ekspandere d* og kalde unzip med: unzip dogme95.zip fe*. Det overlades nu til unzip at ekspandere fe*.

Alternativt kan man sætte en '\' foran stjernen og derved fortælle kommandofortolkeren at stjernen ikke skal ekspanderes. Altså: unzip d* f\*

Se også næste afsnit om regulære udtryk.

Det skal også nævnes, at hvis du kun vil finde et tegn, så brug et spørgsmålstegn. Vil du f.eks. finde alle filer aaa, baa, caa osv. men ikke caaa, så kan du bruge følgende

[tyge@hven MitKatalog]$ touch aaa baa caa caaa
[tyge@hven MitKatalog]$ ls 
aaa   baa   caa   caaa   ccc   fil1   fil2
[tyge@hven MitKatalog]$ ls ?aa
aaa   baa   caa