Hoe gebruik je Find en Locate om bestanden te zoeken in Linux

author
8 minutes, 50 seconds Read

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
Output
1111

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
Output
Database /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.

Similar Posts

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.