Het commando find1 kan je gebruiken om een Unix bestandssysteem te doorzoeken. Dit commando kan op de volgende manier gebruikt worden:

find directory [directory …] criterium [criterium …] actie [actie …]

Het eerste wat moet gespecificeerd worden, is de lijst van directories (en hun onderliggende subdirectories) die moeten doorzocht worden. Deze lijst bestaat uit één of meer (absolute of relatieve) padnamen van directories.

Vervolgens moet je aangeven wat er moet gezocht worden door zoekcriteria op te geven. Enkele voorbeelden van dergelijke zoekcriteria zijn:

optie omschrijving
-name zoek bestanden waarvan de naam overeenkomt met het gegeven patroon
-mtime zoek bestanden die niet gewijzigd zijn sinds het gegeven tijdstip
-type zoek bestanden van een bepaald type (bv. f voor gewone bestanden of d voor directories)
-inum zoek bestanden met een bepaald inode nummer

De lijst van zoekcriteria die je kunt gebruiken met het commando find is schier eindeloos. Raadpleeg de man page van find als je specifieke zoekcriteria nodig hebt.

Als laatste moet je aangeven wat er met de gevonden bestanden moet gebeuren. Voorbeelden van dergelijke acties zijn:

optie omschrijving
-print bestandsnamen uitschrijven naar stdout (standaardactie)
-ls meer details van bestanden uitschrijven naar stdout (analoog aan uitvoer van ls -l)
-exec commando uitvoeren op elk van de gevonden bestanden
-ok commando uitvoeren op elk van de gevonden bestanden (na toestemming van gebruiker)

Als je bijvoorbeeld een lijst wil uitschrijven van alle bestanden in de /dev directory en alle onderliggende subdirectories, dan kan je dit doen met het commando

$ find /dev -name '*' -print

Omdat -print de standaardactie is, mag je die in bovenstaand commando ook weglaten.

Escaping

De shell kent aan sommige karakters een speciale betekenis toe, bijvoorbeeld om filename expansion2 (globbing) uit te uitvoeren. Bij sommige argumenten die je wil doorgeven aan het commando find wil je echter vermijden dat de shell er filename expansion op uitvoert. Dit kan je doen door de filename expansion karakters te escapen3 met behulp van een backslash, enkele aanhalingstekens of dubbele aanhalingstekens.

Opgave

Geef voor elk van de onderstaande opdrachten een Unix commando dat de opdracht uitvoert. Zorg er telkens voor dat alle foutboodschappen onderdrukt worden (niet op het scherm uitgeschreven worden en ook niet op het bestandssysteem opgeslagen worden). Bij het uitvoeren van de opdrachten mag je ervan uitgaan dat de huidige directory een bestand participants.txt4 en een directory files bevat, die op zijn beurt een subdirectory music bevat.

  1. Schrijf een lijst uit met de namen van alle bestanden onder de huidige directory (dus inclusief alle onderliggende subdirectories) die niet recenter gewijzigd zijn dan het bestand participants.txt5.

  2. Verwijder alle lege bestanden (inclusief lege directories) onder de directory files. Zorg ervoor dat er geen enkele uitvoer gegenereerd wordt.

    Tip

    Lege bestanden aanmaken kan eenvoudig aan de hand van het commando touch6. Waaraan zou dit commando zijn naam te danken hebben? Waarvoor zou het nog kunnen gebruikt worden, naast het aanmaken van lege bestanden?

  3. Gebruik het commando gzip7 om alle gewone bestanden onder de huidige directory (dus inclusief alle onderliggende subdirectories) die groter zijn dan 10 kilobytes elk afzonderlijk te comprimeren.

  4. Schrijf een lijst uit met de namen van alle directories onder de huidige directory, behalve die van de directories onder de directory music. Zorg er evenwel voor dat de naam van de directory music zelf wel in de lijst voorkomt.

  5. Schrijf een lijst uit met de namen van alles onder de directory /etc die voor alle andere gebruikers uitvoerbaar zijn en waarvan de naam begint of eindigt met een cijfer.