Ga naar hoofdinhoud

3.2 Bestanden vinden

Hier bouw je op verder: Jokertekens en Zoeken in een bestand met grep

Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.

grep zoekt iets in een bestand. Weet je niet eens waar het bestand staat, dan zoek je het met find. Je geeft een map, en find loopt alles eronder af, map in map:

find /var/www
/var/www
/var/www/html
/var/www/html/config
/var/www/html/config/instellingen.conf
/var/www/html/index.html
/var/www/html/inloggen.html

Elke regel is een dat je zo kunt gebruiken, bijvoorbeeld achter cat.

Terminal laden...

Op naam zoeken​

Met -name noemt find alleen wat zo heet. Een mag, maar dan tussen aanhalingstekens:

find /var/www -name '*.html'
/var/www/html/index.html
/var/www/html/inloggen.html

Zonder aanhalingstekens vult de het sterretje al in voordat find het ziet, als er in de map waar jij staat iets op past. Dan krijgt find die namen in plaats van het patroon. Past er niets, dan blijft het patroon staan en werkt het toevallig. Zet een patroon bij grep en -name daarom altijd tussen aanhalingstekens: dan hangt het niet af van de map waar je staat.

-iname zoekt zonder op hoofdletters te letten: -iname '*.JPG' vindt ook foto.jpg.

Alleen mappen, of alleen bestanden​

Met -type d (directory) noemt find alleen mappen, met -type f (file) alleen bestanden. Je kunt het combineren met -name.

Voorspel​

Wat geeft find /var/www -type d? Hoeveel regels, en welke?

Klik hier als je het hebt geprobeerd
find /var/www -type d
/var/www
/var/www/html
/var/www/html/config

Drie regels. De map waar je begint, telt ook mee: /var/www is zelf een map.

Overal zoeken​

Begin je bij /, dan zoekt find op de hele computer:

find / -name passwd
/etc/passwd
find: ‘/root’: Permission denied

De tweede regel is geen fout van jou: find mocht niet in /root kijken, de van de beheerder. Op je eigen Linux krijg je zo tientallen regels. Ze vertellen alleen dat find daar niet kon zoeken.

Opdracht 3.2.a: alle logboeken​

Programma's schrijven hun logboeken in bestanden die op .log eindigen, ergens onder /var/log. Zoek met één alle bestanden die op .log eindigen.

Terminal laden...
Klik hier voor een tip

Je begint in /var/log, en zoekt op naam met een jokerteken. Vergeet de aanhalingstekens niet.

Klik hier voor het antwoord
find /var/log -name '*.log'
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/log/auth.log

Met ls /var/log had je apache2, auth.log en syslog gezien: syslog eindigt niet op .log, en de andere twee logboeken zitten een map dieper.

Opdracht 3.2.b: welke mappen?​

Laat met één commando alle mappen onder /var zien, /var zelf meegeteld, en geen bestanden.

Terminal laden...
Klik hier voor een tip

Een map heet in find een directory.

Klik hier voor het antwoord
find /var -type d
/var
/var/log
/var/log/apache2
/var/www
/var/www/html
/var/www/html/config

Er gaat iets mis​

paths must precede expression​

find: paths must precede expression: `b.txt'
find: possible unquoted pattern after predicate `-name'?

Oorzaak: je zette het patroon niet tussen aanhalingstekens. De shell vulde *.txt in met de namen uit de map waar je stond, en find kreeg -name a.txt b.txt: één naam te veel. Staat er maar één .txt in je map, dan krijg je geen fout, maar zoekt find stil alleen naar die ene naam.

Oplossing: zet het patroon tussen aanhalingstekens.

# FOUT
find . -name *.txt

# GOED
find . -name '*.txt'

No such file or directory​

find: ‘/var/logs’: No such file or directory

Oorzaak: de map waar je begint, bestaat niet. Hier is het een s te veel.

Oplossing: kijk met ls hoe de map heet, of laat Tab de naam aanvullen.

Permission denied​

find: ‘/root’: Permission denied

Oorzaak: find kwam een map tegen waar jij niet in mag kijken.

Oplossing: meestal niets: wat find wel mocht doorzoeken, staat er ook bij. Waarom je in /root niet mag, lees je in de volgende les.

Door naar 4.1 Van wie is dit?.