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 pad De weg naar een bestand of map, met een / tussen de mappen, zoals /home/student/notities.txt.Uitgelegd in 1.2 Door mappen lopenAlle begrippen dat je zo kunt gebruiken, bijvoorbeeld achter cat.
Op naam zoeken
Met -name noemt find alleen wat zo heet. Een jokerteken Een teken dat op meer namen past: * op elk stuk tekst, ? op precies één teken.Uitgelegd in 2.4 JokertekensAlle begrippen mag, maar dan tussen aanhalingstekens:
find /var/www -name '*.html'
/var/www/html/index.html
/var/www/html/inloggen.html
Zonder aanhalingstekens vult de shell Het programma dat leest wat je typt en daarna het commando start; op Ubuntu heet hij bash.Uitgelegd in 2.4 JokertekensAlle begrippen 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 thuismap Je eigen map, /home/student in de oefenterminal; de prompt kort hem af tot ~.Uitgelegd in 1.1 Je eerste commando'sAlle begrippen 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 commando Een opdracht die je in de terminal typt, zoals whoami of ls; na Enter voert de computer hem uit.Uitgelegd in 1.1 Je eerste commando'sAlle begrippen alle bestanden die op .log eindigen.
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.
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?.