Les 6a Vind je weg

Paul Wiegmans (paul@bonhoeffer.nl)
laatst gewijzigd
Inhoud: find, which, whereis, locate, updatedb, slocate

Intro

Hoe zoek je bestanden in Linux? Hiervoor zijn de hulpprogrammas find, which, whereis en locate. Enkele hulpprogrammas versnellen het zoeken aanzienlijk.

which

Dit commando geeft je de locatie van een commando. Alle commandos die je direct kunt uitvoeren, worden gezocht in enkele mappen. Wanneer een gebruiker iets op de commandoregel tikt, zoekt Linux die bestand op in de mappen aangegeven in de PATH-variabele. Je kunt zien wat in de PATH-variabele staat:
echo $PATH
Wanneer Linux het commando gevonden heeft, wordt het geladen en uitgevoerd.
Het which commando geeft je nu de map waarin Linux het bestand heeft kunnen vinden. Alleen executable bestanden, m.a.w. commandos worden hiermee gevonden door which. Which gebruik je zo
which bestand
waarbij bestand een uitvoerbaar bestand is. Een werkend voorbeeld
which which

whereis

Met whereis kun je niet alleen het uitvoerbare bestand vinden, maar ook de sourcecode en de manpage hiervan en eventueel nog andere bestanden. Verder wordt het gebruikt net zoals which :
whereis lilo
Dit geeft alle bestanden die bij het lilo commando, bijvoorbeeld configuratiebestanden in /etc , of man pages voor het commando.

find

Omdat which alleen uitvoerbare bestanden in het PATH vindt, kun je niet alle bestanden opzoeken. Daarvoor is het find commando. Het findcommando zit wat ingewikkelder in elkaar en kent veel meer mogelijkheden om bestanden te zoeken. In zijn simpelste vorm gebruik je het zo:
find map -name zoekbestand
Hier gaat find zoeken in map genaamd "map" en bovendien alle submappen hieronder en het toont elk bestand genaamd "zoekbestand". Je kunt inplaats van bestand ook een gedeeltelijke bestandspecificatie opgeven met een joker, bijvoorbeeld brief* of docum??? .
Je kunt hierbij ook de rootmap opgeven als je het hele systeem wilt afzoeken. Bedenk wel dat het afzoeken van de hele harde schijf van de computer wat tijd in beslag neemt! Een werkend voorbeeld is dit
find / -name "vmlinu*"
Het is sterk aan te raden de bestandsnaam voor find tussen dubbele aanhalingstekens te zetten. Als je dat niet doet, en je gebruikt jokers in de naam (bijv * of ? ) dan gaat het niet werken. De shell interpreteert de jokers voordat find de parameters leest.
Zeker wanneer je find start als een gewone gebruiker zonder speciale rootprivileges, en laat zoeken op de hele schijf, zal het vaak komen op plaatsen waar jij geen leesrechten hebt. Find geeft dan een foutmelding en de uitvoer wordt rommelig. Je kunt deze foutmeldingen, waarin je meestal toch niet bent geinteresseerd, afvangen door de foutmeldingen in de bittenbak te sturen.
find / -name "vmlinu*" 2> /dev/null
Zo krijg je alleen de informatie die je zoekt.

Locate

Omdat het zoeken van de hele schijf veel tijd kost heeft men ooit het idee gekregen om alle bestandsnamen in een database te bewaren. Het zoeken in een database gaat veel sneller dan het zoeken op een schijf in alle mappen. Het commando daarvoor is locate  :
locate naam
zoekt naar bestand "naam". Het zoeken gaat veel sneller, maar heeft ook een nadeel. De database moet wel bijgewerkt worden. Als er veel bestanden verwijderd of aangemaakt zijn, dan klopt de database niet meer. De database kun je dan met de hand bijwerken met het commando
updatedb
Dat kost natuurlijk evenveel tijd en ook verwerkingscapaciteit als het commando find gebruikt.  Als je de database bijwerkt ga je daar niet op wachten. Je kunt dit commando dan beter in de achtergrond uitvoeren met
updatedb &
Linux doet dat automatisch een maal per dag en in de achtergrond zodat de gebruiker dat niet merkt.

Opdrachten

  1. Zoek het uitvoerbaar bestand icewm.
  2. Zoek het uitvoerbaar bestand lilo.
  3. Zoek het uitvoerbaar bestand useradd . Waarom kun je het niet vinden?
  4. Werk de locate-database bij
  5. Zoek met find het bestand lilo.conf op .
  6. Zoek met locate lilo.conf op . Wat is sneller?
  7. zoek met whereis alle bestanden met de naam "lilo"
  8. zoek met whereis alle bestanden met de naam "ssh"
  9. zoek naar alle bestanden genaamd linux