Tips en Trucs 2013

Zoekopdrachten

Vandaag bekijken hoe we de find opdracht kunnen gebruiken.

Zoeken naar bestanden met een bepaalde naam

Om naar een bestand met een bepaalde naam in de huidige map en zijn submappen te zoeken, gebruik je:

find . -name 'zoekterm'

waarbij je zoekterm vervangt door de naam van het te zoeken bestand. Een voorbeeld:

dany@linux-o4h0:~> find . -name 'HelloWorld'
find: `./.smolt': Toegang geweigerd
./C++/IDE/HelloWorld
./C++/IDE/HelloWorld/Debug/HelloWorld

Het gebruik van jokertekens is toegelaten, maar enkel als je de zoekterm tussen enkele aanhalingstekens plaatst. De jokertekens zorgen dat je zoektermen kunt gebruiken die een deel van de bestandsnaam bevatten:

dany@linux-o4h0:~> find . -name '*World*'
find: `./.smolt': Toegang geweigerd
./C++/IDE/HelloWorld
./C++/IDE/HelloWorld/HelloWorld.workspace.session
./C++/IDE/HelloWorld/HelloWorld.mk
./C++/IDE/HelloWorld/HelloWorld.workspace.dany_pinoy
./C++/IDE/HelloWorld/HelloWorld.workspace
./C++/IDE/HelloWorld/HelloWorld_wsp.mk
./C++/IDE/HelloWorld/HelloWorld.txt
./C++/IDE/HelloWorld/HelloWorld.project
./C++/IDE/HelloWorld/HelloWorld.tags
./C++/IDE/HelloWorld/Debug/HelloWorld

Zoeken naar tekst in bestanden

Om naar bestanden te zoeken die een bepaalde tekst bevatten, gebruik je:

find . -print0 | xargs -0 grep 'zoekterm' -sl

waarbij je zoekterm vervangt door een in de bestanden op te zoeken tekstfragment. Een voorbeeld:

dany@linux-o4h0:~> find . -print0 | xargs -0  grep 'hello world' -sl
...
./C++/IDE/HelloWorld/main.cpp
./C++/IDE/HelloWorld/Debug/main.o
./C++/IDE/HelloWorld/Debug/HelloWorld
...

Deze opdracht toont alle namen van bestanden waarin de zoekterm voorkomt, de zoekterm mag daarbij een reguliere expressie zijn.

Merk op dat de opdracht ook werkt met rare bestandsnamen die spaties en regeleinde's bevatten. De -print0 en -0 opties voor xargs zorgen daarvoor. Raadpleeg de man pagina van xargs om daarover meer te weten te komen.

Op andere pagina's op het internet wordt de exec optie van de find opdracht gebruikt, xargs werkt echter sneller. Het gebruik van de exec optie van de find opdracht heeft als voordeel dat het op meer systemen werkt, zowel oude als recente.

Om het gebruik te vereenvoudigen, plaats je op het einde van het .bashrc bestand in uw Persoonlijke map een functie van de bovenstaande opdracht:

function f() { find . -print0 | xargs -0 grep "$1" -sl; }

Na het herstarten van de terminal (opnieuw inloggen) zoek je bestanden die een bepaalde tekst bevatten met:

dany@linux-o4h0:~> f 'hello world'
...
./C++/IDE/HelloWorld/main.cpp
./C++/IDE/HelloWorld/Debug/main.o
./C++/IDE/HelloWorld/Debug/HelloWorld
...

Zoeken naar bestanden met bepaalde rechten

Om bestanden met bepaalde rechten te zoeken, gebruik je de perm optie:

find . -perm -644

Deze opdracht toont alle bestanden die op zijn minst lees- en schrijfrechten voor de gebruiker en leesrechten voor de groep en de rest heeft (rw-r--r--).

find . -perm 644

Deze opdracht toont alle bestanden die enkel lees- en schrijfrechten voor de gebruiker en leesrechten voor de groep en de rest heeft (rw-r--r--).

find . -perm /644

Deze opdracht toont alle bestanden die lees- of schrijfrechten voor de gebruiker of leesrechten voor de groep of de rest heeft (rw-r--r--).

Zo toont de eerste opdracht op mijn computer 2751 bestanden, de tweede opdracht 2273 bestanden en de derde opdracht 13763 bestanden. Deze resultaten kwamen tot stand door achter de opdrachten | nl te voegen waardoor de uitvoer regelnummers krijgt.

Om alle door de huidige gebruiker beschrijfbare bestanden te tonen, gebruik je de opdracht:

find . -writable

Nog wat trucs

Naar analogie met de find grep combinatie van hierboven, gebruik je xargs om andere taken uit te voeren, zoals het verwijderen van bestanden of het vervangen van tekst. Om de door find gevonden bestanden te verwijderen, gebruik je de opdracht:

find . -name 'te zoeken bestandsnaam' -print0 | xargs -0 rm -i

De -i optie bij de rm opdracht zorgt voor een bevestiging bij het verwijderen van elk bestand.

Om de tekst in verschillende bestanden door een andere tekst te vervangen, gebruik je find in combinatie met sed. Het volgende voorbeeld zoekt naar bestanden waarin het getal 12121 staat en vervangt deze door het getal 99999:

find . -print0 | xargs -0 grep '12121' -sl | xargs sed -i .ori 's/12121/99999/g'

De sed opdracht zoekt naar het eerste tekstfragment en vervangt het door het tweede tekstfragment. De g optie zorgt voor een globale vervanging, waardoor alle gevonden tekstfragmenten in een bestand vervangen worden. De -i .ori optie zorgt voor het opslaan van het aangepaste bestand met dezelfde naam en maakt daarbij een back-up bestand van het originele bestand door aan de originele bestandsnaam .ori toe te voegen.