Linux find tips

In Linux is de enige bruikbare methode om iets te vinden het commando 'find'. Maar zoals elke complexe tool is hij niet makkelijk te temmen. Nu zul je zeggen, en (s)locate dan? Ja, hartstikke mooi...als je alleen de naam en/of locatie wil weten. Als je meer wilt ben je toch aangewezen op find. Of google desktop natuurlijk. Maar als je echt command line wil zoeken zul je toch find met al zijn nukken moeten leren gebruiken.

Een van de meest vervelende dingen van find is dat ook echt alles doorzocht wordt (mooi, zo'n tool wat ook écht doet wat je vraagt). Als je find namelijk op je root systeem uitvoert worden ook al je gemounte disken, nfs mounts, cdrom's, etc, etc doorzocht. Niet iets wat de snelheid bevorderd. Daar is de optie -prune voor bedoeld. Hiermee kun je bijvoorbeeld /media en /mnt skippen. (Of je /dev of /proc bijvoorbeeld).

Stel ik wil bestanden vinden die de laatste 30 dagen zijn gewijzigd. Heel vaak zul je tips tegenkomen die het volgende aanraden:

find . -type d \( -name media -o -name mnt \) -prune -o -mtime 30

Of deze

find . -path '/media' -prune -o -path '/mnt' -prune -o -mtime 30

In alletwee deze tips zitten problemen: in de eerste skip je ook /srv/media of /var/www/media en in de de tweede vind je de folders /media en /mnt ook in je resultaten terug. Dat laatste is niet erg als je de resultaten handmatig beoordeeld, maar in een script zou je wel eens tegen een probleem aan kunnen lopen.

Het probleem zit hem in de onhandige implementatie van -prune. Het is beter om find te vertellen dat je /media *niet* wilt vinden. Door de 'skip' folders op te nemen in een groep krijg je precies wat je wil vinden: alleen bestanden/folders die de laatste 30 dagen zijn gewijzigd:

find / ! \( -path /media -prune -o -path /mnt \) -a -mtime 30

Een andere oplossing die ik gebruik als ik vanaf / wil zoeken is opgeven welke folders ik dan wel wil zoeken:

find /bin /boot /etc /home /lib /opt /sbin /srv /tmp /usr /var

Door dit in een alias te zetten (let op spatie aan het eind):

alias ff='find /bin /boot /etc /home /lib /opt /sbin /srv /tmp /usr /var '

kun je vervolgens met 'ff -mtime 30' de latest en greatest terugvinden met een simpele opdracht.