next up previous contents index
Next: Skall-programmering Up: Fleire kommandoar til vanleg Previous: Kommandoen sleep

Kommandoen find

Dersom ein ein vil operere på filar i subkatalogar i tillegg til filar på ståande katalog så har vi kommandoen find. Kommandoen er ein av dei kraftigaste,- og har også ein av dei vanskelegaste kommando-linjene i UNIX. På den andre sida er find så kraftig at det er vel anvente timar å lære seg alle knep med denne kommandoen. Kommandoen leitar seg ned gjennom hierarkiet i filsystemet og lokaliserer alle filar som kvalifiserer kriteriane på kommando-linja. Kommandoen kan utføre ei rekkje med aksjonar på filane den finn. Basisen for kommando-linja er følgande :

zevs% find sti-liste utrykk
der sti-liste er ei liste av katalogar,- liste kan innholde ein eller fleire katalogar, med enten relative eller fulle sti-namn. Uttrykksdelen er operatorane som beskriv utvalgskriteriet for filar, og aksjonane som find skal utføre på dei.

zevs% find $HOME/text/unixkurs -print
/home/zevs/ifi/trondk/text/unixkurs
/home/zevs/ifi/trondk/text/unixkurs/kurs.log
/home/zevs/ifi/trondk/text/unixkurs/kurs.tex
/home/zevs/ifi/trondk/text/unixkurs/ps
/home/zevs/ifi/trondk/text/unixkurs/ps/kjerne.ps
/home/zevs/ifi/trondk/text/unixkurs/ps/kurs.ps
/home/zevs/ifi/trondk/text/unixkurs/ps/skall.ps
/home/zevs/ifi/trondk/text/unixkurs/ps/program.ps
/home/zevs/ifi/trondk/text/unixkurs/ps/rettigheter.ps
/home/zevs/ifi/trondk/text/unixkurs/ps/banner.ps
/home/zevs/ifi/trondk/text/unixkurs/kurs.tex 
/home/zevs/ifi/trondk/text/unixkurs/bak
/home/zevs/ifi/trondk/text/unixkurs/bak/kurs.tex
/home/zevs/ifi/trondk/text/unixkurs/kurs.dvi
/home/zevs/ifi/trondk/text/unixkurs/kurs.aux
/home/zevs/ifi/trondk/text/unixkurs/kurs.toc
/home/zevs/ifi/trondk/text/unixkurs/kurs.ps
zevs%
Dette er ein av dei minste kommandoane, find skal finne alle filar og katalogar under $HOME/text/unixkurs. Ein kan også som nemnt tidlegare bruke ei liste av katalogar.

zevs% find $HOME /home/zevs/ifi/eyvindh -print
Kommandoen find kan også ta jokertegn :

zevs% find /home/zevs/ifi/* -print
Som standard utfører ikkje find nokon aksjon på filene den finn, så derfor er -print nødvendig for at find skal liste ut filane på standard ut, eit namn for kvar linje.

zevs% find / -print | wc -l
Denne kommandoen vil telle antal filar og katalogar på denne maskina. Store operasjonar med find tek gjerne lang tid å fullføre, spesielt på store maskiner og maskiner med filsystem ute i nettverket. Bruk fornuften og prøv å avgrense søket mest mulig ved å gå så langt ned i filsystemet som mulig. Det finst ei rekkje forskjellige operatorar for å finne filar,- namn, eigar av fil, gruppe, dato og størrelse, for å nemne nokre. Alle operatorar startar med - ( minus-tegnet ).

zevs% find . -name .profile -print
./.profile
./oppstartfiler/oppstart.old/.profile
./.rsrc/.profile
zevs%
Det spesifiserte namnet kan også inneholde jokertegn dersom det vert sett i herme-tegn.

zevs% find . -name "*profile" -print
Andre jokertegn som ?, [ og ] kan også brukast dersom dei også vert sett i hermetegn. Når find søkjer i eit filsystem så er rekkefølgen avhengig av den interne organiseringa av filsystemet,- dersom ein vil har sorteret rekkefølje må ein redirigere utdataene frå find til sort. Når fleire operatorar er spesifisert vert det utført frå venstre mot høgre.

zevs% find . -print -name "*profile"
er ikkje det same som :

zevs% find . -name "*profile" -print
fordi den første kommandoen skriv ut filnamn etter kvart som den filar eller katalogar og deretter leitar etter filar som kan passe namnet "*profile". Den andre kommandoen leiter etter filar som kan passe namnet "*profile" først og etterpå skriv ut namnet på dei filane kommandoen har funne. Kommandoen søkjer etter alle filnamn i sti-lista, brukar utrykka frå venstre mot høgre for å godta eller å forkaste filar heilt til det siste uttrykket er utført. Dersom ei fil ikkje tilfredsstiller eit uttrykk vil ikkje dei etterfølgande bli utført. Vi kan gå litt nærare inn på opsjonar for find. Opsjonen for å finne filar med eigar, -user og gruppe -group. Opsjonen -type c leiter etter filar av bestem type,- der c er den type fil som kjem fram i venstre kolonne ved ein ls -l ( f for fil, d for katalog, l for symbolsk lenke, p for pipe, dette er vel dei mest vanlege ). Opsjonen -mtime n velger ut filar som var modifisert akkurat for n dagar sidan. Uttrykket -mtime -n velger ut alle filar som har vore modifisert dei siste n dagar. Uttrykket -mtime +n finn alle filar finn alle filar som har vore modifisert før n dagar sidan. Ellers kan ein finne filar etter størrelse,- -size n finn alle filar på nøyaktig n blokker, -size -n finn alle filar under n blokker og -size +n alle over n blokker.

zevs% find / -type f -size +1000 -print
Denne kommandoen vil finne alle filar i systemet som er over 1000 blokker,- dvs. over 512 000 byte. Ein kan invertere uttrykka ved å sette eit utropstegn framfor operatoren ( dette tegnet blir ofte kalla bang-operatoren i UNIX- og C-dokumentasjon ).

zevs% find $HOME -type f ! -user $LOGNAME -print
Denne kommandoen finn alle filar i min heimekatalog som ikkje eg eig. Operatoren ! må ha mellomrom eller tabulator på begge sider, og den inverterer berre den operatoren som kjem rett etter utropstegnet. Ein kan også lage større logisk uttrykk med eller-operator.

zevs% find $HOME -size +50 -o ! -user $LOGNAME -print
Operatoren -o betyr eller ( engelsk or ). Denne kommandoen vil med andre ord finne alle filar over 50 blokker og alle filar som ikkje eg eig. Alle operatorar som ikkje har -o mellom seg er logisk knytta saman med og ( engelsk and ). Meir avanserte kommandoar :

zevs% find . -type f [IMAGE ]( -name "*.abc" -o -name"*.def" -o -name "*.ghi" [IMAGE ]) -print 
Her vil ein finne alle vanlege filar som enten endar på abd, def eller ghi. Legg merke til at vi må unnta parantesane for spesiell betydning ved hjelp av bakslask-tegnet ( tegnet [IMAGE ] ). Dette er fordi parentes har ein spesiell betydning for alle skall,- det skal vi kome tilbake til seinare. Kommandoen find kan eksekvere alle kommandoar for kvar fil den finn ved hjelp av dei andre operatorane. Operatoren -exec tek ei etterfølgande kommando-linje. Kommandoen kan inkludere namnet på den fila som find prosesserer ved å bruke spesial-syntaksen { og }. Kommando-linja vert avslutta med tegna [IMAGE ];. Ein kommando som forandrar aksess-rettighetane på alle filar på heimekatalogen.

zevs% find $HOME -exec chmod -rw {} [IMAGE ];-print
Operatoren -exec evalurer til sant dersom kommandoen den utfører returnerer 0 som returverdi,- ellers vil den returnere usant.


next up previous contents index
Next: Skall-programmering Up: Fleire kommandoar til vanleg Previous: Kommandoen sleep
Trond.Kandal@itea.ntnu.no