Inleiding
Een probleem waar gebruikers tegenaan lopen als ze voor het eerst met een Linux-machine werken, is hoe ze de bestanden kunnen vinden die ze zoeken.
Deze gids behandelt hoe je het toepasselijk genaamde find
commando kunt gebruiken. Dit zal u helpen om naar bestanden op uw VPS te zoeken met behulp van een verscheidenheid aan filters en parameters. We zullen ook kort het locate
commando behandelen, dat gebruikt kan worden om op een andere manier naar bestanden te zoeken.
Vinden op naam
De meest voor de hand liggende manier om naar bestanden te zoeken is op naam.
Om een bestand op naam te vinden, typt u:
- find -name "query"
Dit zal hoofdlettergevoelig zijn, wat betekent dat een zoekopdracht naar file
anders is dan een zoekopdracht naar File
.
Om een bestand op naam te vinden, maar het hoofdlettergebruik van de zoekopdracht te negeren, typt u:
- find -iname "query"
Als u alle bestanden wilt vinden die niet aan een bepaald patroon voldoen, kunt u het zoeken omkeren met -not
of !
. Als u !
gebruikt, moet u het karakter escapen zodat bash het niet probeert te interpreteren voordat find in actie kan komen:
- find -not -name "query_to_avoid"
Or
- find \! -name "query_to_avoid"
Vinden op Type
U kunt het type bestanden dat u wilt vinden specificeren met de -type
parameter. Het werkt als volgt:
- find -type type_descriptor query
Enkele van de meest voorkomende descriptoren die u kunt gebruiken om het type bestand aan te geven zijn hier:
-
f: regulier bestand
-
d: directory
-
l: symbolische koppeling
-
c: tekenapparaten
-
b: block devices
Als we bijvoorbeeld alle character devices op ons systeem willen vinden, kunnen we dit commando geven:
- find / -type c
Output/dev/parport0/dev/snd/seq/dev/snd/timer/dev/autofs/dev/cpu/microcode/dev/vcsa7/dev/vcs7/dev/vcsa6/dev/vcs6/dev/vcsa5/dev/vcs5/dev/vcsa4. . .
We kunnen als volgt zoeken naar alle bestanden die eindigen op .conf
:
- find / -type f -name "*.conf"
Output/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf/usr/share/base-files/nsswitch.conf/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf/usr/share/rsyslog/50-default.conf/usr/share/adduser/adduser.conf/usr/share/davfs2/davfs2.conf/usr/share/debconf/debconf.conf/usr/share/doc/apt-utils/examples/apt-ftparchive.conf. . .
Filteren op tijd en grootte
Find geeft u een aantal manieren om resultaten te filteren op grootte en tijd.
Size
U kunt filteren op grootte met behulp van de -size
parameter.
We voegen een achtervoegsel toe aan het eind van onze waarde dat aangeeft hoe we tellen. Dit zijn enkele populaire opties:
-
c: bytes
-
k: Kilobytes
-
M: Megabytes
-
G: Gigabytes
-
b: 512-byte blokken
Om alle bestanden te vinden die precies 50 bytes groot zijn, typt u:
- find / -size 50c
Om alle bestanden te vinden die minder dan 50 bytes groot zijn, kunnen we in plaats daarvan deze vorm gebruiken:
- find / -size -50c
Om alle bestanden te vinden die meer dan 700 megabytes zijn, kunnen we dit commando gebruiken:
- find / -size +700M
Time
Linux slaat tijdgegevens op over toegangstijden, modificatietijden, en wijzigingstijden.
-
Toegangstijd: Laatste keer dat er naar een bestand is gelezen of geschreven.
-
Wijzigingstijd: Laatste keer dat de inhoud van het bestand is gewijzigd.
-
Wijzigingstijd: Laatste keer dat de meta-gegevens van de inode van het bestand werden gewijzigd.
We kunnen deze gebruiken met de -atime
, -mtime
, en -ctime
parameters. Deze kunnen de plus en min symbolen gebruiken om groter dan of kleiner dan aan te geven, zoals we deden met size.
De waarde van deze parameter geeft aan hoeveel dagen geleden u wilt zoeken.
Om bestanden te vinden met een wijzigingstijd van een dag geleden, type:
- find / -mtime 1
Als we bestanden willen die minder dan een dag geleden zijn benaderd, kunnen we typen:
- find / -atime -1
Om bestanden te krijgen waarvan de meta-informatie meer dan 3 dagen geleden voor het laatst is gewijzigd, type:
- find / -ctime +3
Er zijn ook enkele begeleidende parameters die we kunnen gebruiken om minuten te specificeren in plaats van dagen:
- find / -mmin -1
Dit geeft de bestanden die zijn gewijzigd type het systeem in de laatste minuut.
Find kan ook vergelijkingen doen met een referentiebestand en de nieuwere teruggeven:
- find / -newer myfile
Vinden op Eigenaar en Rechten
U kunt ook naar bestanden zoeken op de bestandseigenaar of de groepseigenaar.
U doet dit door respectievelijk de -user
en -group
parameters te gebruiken. Zoek een bestand dat eigendom is van de “syslog” gebruiker door in te voeren:
- find / -user syslog
Op dezelfde manier kunnen we bestanden specificeren die eigendom zijn van de “shadow” groep door in te voeren:
- find / -group shadow
We kunnen ook zoeken naar bestanden met specifieke permissies.
Als we willen overeenkomen met een exacte set machtigingen, gebruiken we deze vorm:
- find / -perm 644
Dit zal overeenkomen met bestanden met precies de gespecificeerde machtigingen.
Als we iets willen specificeren met ten minste deze machtigingen, kunt u deze vorm gebruiken:
- find / -perm -644
Dit zal overeenkomen met alle bestanden die extra machtigingen hebben. Een bestand met permissies “744” zou in dit geval overeenkomen.
Filteren op diepte
Voor dit gedeelte maken we een directory structuur aan in een tijdelijke directory. Het zal drie niveaus van directories bevatten, met tien directories op het eerste niveau. Elke directory (inclusief de tijdelijke directory) zal tien bestanden en tien submappen bevatten.
Maak deze structuur door de volgende commando’s uit te voeren:
- cd
- mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
- touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
- cd ~/test
Voel je vrij om de directory structuren te bekijken met ls
en cd
om een handvat te krijgen hoe dingen georganiseerd zijn. Als u klaar bent, keer dan terug naar de test directory:
- cd ~/test
We zullen werken aan hoe we specifieke bestanden uit deze structuur kunnen halen. Laten we eerst een voorbeeld proberen met gewoon zoeken op naam, ter vergelijking:
- find -name file1
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1./level1dir7/level2dir8/level3dir6/file1./level1dir7/level2dir8/level3dir5/file1./level1dir7/level2dir8/file1. . .
Er zijn een heleboel resultaten. Als we de uitvoer naar een teller leiden, kunnen we zien dat er in totaal 1111 resultaten zijn:
- find -name file1 | wc -l
Output1111
Dit zijn waarschijnlijk te veel resultaten om nuttig te zijn voor u in de meeste omstandigheden. Laten we proberen het te beperken.
U kunt de maximale diepte van de zoekopdracht onder de top-level zoekdirectory opgeven:
- find -maxdepth num -name query
Om “file1” alleen in de “level1” directory’s en hoger te vinden, kunt u een maximale diepte van 2 opgeven (1 voor de top-level directory, en 1 voor de level1 directory’s):
- find -maxdepth 2 -name file1
Output./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1
Dat is een veel beter beheersbare lijst.
U kunt ook een minimum directory opgeven als u weet dat alle bestanden voorbij een bepaald punt onder de huidige directory bestaan:
- find -mindepth num -name query
We kunnen dit gebruiken om alleen de bestanden aan het einde van de directory-takken te vinden:
- find -mindepth 4 -name file
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1. . .
Wederom, vanwege onze vertakkende directory-structuur, zal dit een groot aantal resultaten opleveren (1000).
U kunt de min- en max-diepteparameters combineren om u op een beperkt bereik te concentreren:
- find -mindepth 2 -maxdepth 3 -name file
Output./level1dir7/level2dir8/file1./level1dir7/level2dir5/file1./level1dir7/level2dir7/file1./level1dir7/level2dir2/file1./level1dir7/level2dir10/file1./level1dir7/level2dir6/file1./level1dir7/level2dir3/file1./level1dir7/level2dir4/file1./level1dir7/file1. . .
Uitvoeren en combineren van zoekopdrachten
U kunt een willekeurig helper-commando uitvoeren op alles wat overeenkomt met de zoekopdracht door de parameter -exec
te gebruiken. Dit wordt als volgt opgeroepen:
- find find_parameters -exec command_and_params {} \;
De {}
wordt gebruikt als een plaatshouder voor de bestanden die overeenkomen. De \;
wordt gebruikt zodat find weet waar het commando eindigt.
Voorbeeld, we kunnen de bestanden in de vorige sectie vinden die 644
permissies hadden en ze wijzigen naar 664
permissies:
- cd ~/test
- find . -type f -perm 644 -exec chmod 664 {} \;
We kunnen dan de directory permissies als volgt wijzigen:
- find . -type d -perm 755 -exec chmod 700 {} \;
Als u verschillende resultaten aan elkaar wilt rijgen, kunt u de -and
of -or
commando’s gebruiken. De -and
wordt verondersteld indien deze is weggelaten.
- find . -name file1 -or -name file9
Bestanden zoeken met Locate
Een alternatief voor het gebruik van find
is het locate
commando. Dit commando is vaak sneller en kan met gemak het hele bestandssysteem doorzoeken.
U kunt het commando op Debian of Ubuntu installeren met apt
:
- sudo apt install mlocate
Op CentOS gebruikt u dnf
in plaats daarvan:
- sudo dnf install mlocate
De reden dat locate
sneller is dan find
is omdat het vertrouwt op een database van de bestanden op het bestandssysteem.
De database wordt meestal een keer per dag bijgewerkt met een cron script, maar u kunt het handmatig bijwerken door te typen:
- sudo updatedb
Run nu dit commando. Vergeet niet dat de database altijd up-to-date moet zijn als u recent verworven of aangemaakte bestanden wilt vinden.
Om bestanden te vinden met locate, gebruikt u gewoon deze syntaxis:
- locate query
U kunt de uitvoer op enkele manieren filteren.
Om bijvoorbeeld alleen bestanden terug te geven die de query zelf bevatten, in plaats van elk bestand terug te geven dat de query heeft in de directories die ernaartoe leiden, kunt u de -b
gebruiken om alleen in de “basisnaam” te zoeken:
- locate -b query
Om locate alleen resultaten terug te laten geven die nog in het bestandssysteem bestaan (die niet zijn verwijderd tussen de laatste updatedb
-aanroep en de huidige locate
-aanroep), gebruikt u de -e
-vlag:
- locate -e query
Om statistieken te zien over de informatie die locate heeft gecatalogiseerd, gebruikt u de -S
optie:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database
Conclusie
Zowel find als locate zijn goede manieren om bestanden op uw systeem te vinden. Het is aan u om te beslissen welke van deze gereedschappen geschikt is in elke situatie.
Vinden en lokaliseren zijn krachtige commando’s die kunnen worden versterkt door ze te combineren met andere hulpprogramma’s via pijplijnen. Experimenteer met filteren door commando’s als wc
, sort
, en grep
te gebruiken.