Hur man använder Find och Locate för att söka efter filer i Linux

author
9 minutes, 36 seconds Read

Introduktion

Ett problem som användarna stöter på när de för första gången använder en Linux-maskin är hur de ska hitta filerna de letar efter.

Den här guiden kommer att behandla hur man använder det välbehövliga kommandot find. Detta kommer att hjälpa dig att söka efter filer på din VPS med hjälp av en mängd olika filter och parametrar. Vi kommer också att kortfattat täcka kommandot locate, som kan användas för att söka efter filer på ett annat sätt.

Söka efter namn

Det mest uppenbara sättet att söka efter filer är efter namn.

För att hitta en fil efter namn skriver du:

  • find -name "query"

Detta kommer att vara skiftlägeskänsligt, vilket innebär att en sökning efter file skiljer sig från en sökning efter File.

För att hitta en fil efter namn, men ignorera skiftläget i frågan, skriver du:

  • find -iname "query"

Om du vill hitta alla filer som inte följer ett visst mönster kan du invertera sökningen med -not eller !. Om du använder ! måste du undslippa tecknet så att bash inte försöker tolka det innan find kan agera:

  • find -not -name "query_to_avoid"

Och

  • find \! -name "query_to_avoid"

Finding by Type

Du kan ange vilken typ av filer du vill hitta med parametern -type. Det fungerar så här:

  • find -type type_descriptor query

Några av de vanligaste deskriptorerna som du kan använda för att ange filtypen finns här:

  • f: vanlig fil

  • d: katalog

  • l: symbolisk länk

  • c: teckenenheter

  • b:

Om vi till exempel vill hitta alla teckenenheter på vårt system kan vi skicka det här kommandot:

  • 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. . .

Vi kan söka efter alla filer som slutar på .conf på följande sätt:

  • 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. . .

Filtrering efter tid och storlek

Find ger dig en mängd olika sätt att filtrera resultat efter storlek och tid.

Storlek

Du kan filtrera efter storlek med hjälp av parametern -size.

Vi lägger till ett suffix i slutet av vårt värde som anger hur vi räknar. Dessa är några populära alternativ:

  • c: bytes

  • k: Kilobyte

  • M: Megabyte

  • G: Gigabyte

  • b: 512-byte block

För att hitta alla filer som är exakt 50 byte skriver du:

  • find / -size 50c

För att hitta alla filer som är mindre än 50 byte kan vi använda detta formulär i stället:

  • find / -size -50c

För att hitta alla filer som är större än 700 megabyte kan vi använda det här kommandot:

  • find / -size +700M

Time

Linux lagrar tidsuppgifter om åtkomsttider, modifieringstider och ändringstider.

  • Accesstid:

  • Modifieringstid: Senaste gången en fil lästes eller skrevs:

  • >Change Time: Senaste gången innehållet i filen ändrades: Vi kan använda dessa med parametrarna -atime, -mtime och -ctime. Dessa kan använda plus- och minussymbolerna för att ange större än eller mindre än, precis som vi gjorde med storlek.

    Värdet för den här parametern anger hur många dagar sedan du vill söka.

    För att hitta filer som har en modifieringstid för en dag sedan skriver du:

    • find / -mtime 1

    Om vi vill ha filer som har åtkommits för mindre än en dag sedan kan vi skriva:

    • find / -atime -1

    För att få fram filer vars metainformation senast ändrades för mer än tre dagar sedan skriver du:

    • find / -ctime +3

    Det finns också några kompletterande parametrar som vi kan använda för att ange minuter i stället för dagar:

    • find / -mmin -1

    Detta kommer att ge de filer som har ändrats typ systemet under den senaste minuten.

    Find kan också göra jämförelser mot en referensfil och återge de som är nyare:

    • find / -newer myfile

    Sökning efter ägare och behörigheter

    Du kan också söka efter filer efter filägaren eller gruppägaren.

    Detta gör du genom att använda parametrarna -user respektive -group. Hitta en fil som ägs av användaren ”syslog” genom att skriva:

    • find / -user syslog

    På samma sätt kan vi ange filer som ägs av gruppen ”shadow” genom att skriva:

    • find / -group shadow

    Vi kan också söka efter filer med specifika behörigheter.

    Om vi vill matcha en exakt uppsättning behörigheter använder vi den här formen:

    • find / -perm 644

    Detta kommer att matcha filer med exakt de angivna behörigheterna.

    Om vi vill specificera något med minst dessa behörigheter kan du använda den här formen:

    • find / -perm -644

    Detta kommer att matcha alla filer som har ytterligare behörigheter. En fil med behörigheterna ”744” skulle matchas i det här fallet.

    Filtrering efter djup

    För det här avsnittet kommer vi att skapa en katalogstruktur i en temporär katalog. Den kommer att innehålla tre nivåer av kataloger, med tio kataloger på den första nivån. Varje katalog (inklusive temp-katalogen) kommer att innehålla tio filer och tio underkataloger.

    Skapa denna struktur genom att utfärda följande kommandon:

    • 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

    Känn dig fri att kolla in katalogstrukturerna med ls och cd för att få ett grepp om hur saker och ting är organiserade. När du är klar återvänder du till testkatalogen:

    • cd ~/test

    Vi kommer att arbeta med hur man återvänder specifika filer från denna struktur. Låt oss prova ett exempel med bara en vanlig namnsökning först, för att jämföra:

    • 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. . .

    Det finns en hel del resultat. Om vi överför utdata till en räknare kan vi se att det finns 1111 totala resultat:

    • find -name file1 | wc -l
    Output
    1111

    Detta är förmodligen för många resultat för att vara användbart för dig i de flesta fall. Låt oss försöka begränsa den.

    Du kan ange det maximala sökdjupet för sökningen under toppnivåkatalogen:

    • find -maxdepth num -name query

    För att hitta ”file1” endast i ”level1”-katalogerna och högre kan du ange ett maxdjup på 2 (1 för toppnivåkatalogen och 1 för level1-katalogerna):

    • 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

    Det är en mycket mer hanterbar lista.

    Du kan också ange en minsta katalog om du vet att alla filer finns efter en viss punkt under den aktuella katalogen:

    • find -mindepth num -name query

    Vi kan använda detta för att hitta endast filerna i slutet av katalogförgreningarna:

    • 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. . .

    Också här kommer detta att ge ett stort antal resultat (1000) på grund av vår grenade katalogstruktur.

    Du kan kombinera parametrarna min och max djup för att fokusera på ett smalt område:

    • 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. . .

    Exekvera och kombinera sökkommandon

    Du kan exekvera ett godtyckligt hjälpkommando på allt som find matchar genom att använda parametern -exec. Detta kallas så här:

    • find find_parameters -exec command_and_params {} \;

    Den {} används som en platshållare för de filer som hitta matchar. \; används så att find vet var kommandot slutar.

    Till exempel kan vi hitta filerna i föregående avsnitt som hade 644-behörigheter och ändra dem till att ha 664-behörigheter:

    • cd ~/test
    • find . -type f -perm 644 -exec chmod 664 {} \;

    Vi kan sedan ändra katalogbehörigheterna på följande sätt:

    • find . -type d -perm 755 -exec chmod 700 {} \;

    Om du vill kedja ihop olika resultat kan du använda kommandona -and eller -or. -and antas om det utelämnas.

    • find . -name file1 -or -name file9

    Sök filer med Locate

    Ett alternativ till att använda find är kommandot locate. Detta kommando är ofta snabbare och kan söka i hela filsystemet med lätthet.

    Du kan installera kommandot på Debian eller Ubuntu med apt:

    • sudo apt install mlocate

    På CentOS använder du dnf i stället:

    • sudo dnf install mlocate

    Förklaringen till att locate är snabbare än find är att det förlitar sig på en databas över filerna i filsystemet.

    Databasen uppdateras vanligtvis en gång om dagen med ett cronskript, men du kan uppdatera den manuellt genom att skriva:

    • sudo updatedb

    Kör det här kommandot nu. Kom ihåg att databasen alltid måste vara uppdaterad om du vill hitta nyligen förvärvade eller skapade filer.

    För att hitta filer med locate använder du helt enkelt den här syntaxen:

    • locate query

    Du kan filtrera utdata på vissa sätt.

    För att till exempel bara returnera filer som innehåller själva frågeställningen, istället för att returnera varje fil som har frågeställningen i de kataloger som leder till den, kan du använda -b för att bara söka i ”basnamnet”:

    • locate -b query

    För att locate bara ska returnera resultat som fortfarande existerar i filsystemet (som inte togs bort mellan det senaste updatedb-anropet och det aktuella locate-anropet), använder du -e-flaggan:

    • locate -e query

    Om du vill se statistik om den information som locate har katalogiserat använder du alternativet -S:

    • 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

    Slutsats

    Både find och locate är bra sätt att hitta filer i ditt system. Det är upp till dig att avgöra vilket av dessa verktyg som är lämpligt i varje situation.

    Find och locate är kraftfulla kommandon som kan stärkas genom att kombinera dem med andra verktyg genom pipelines. Experimentera med filtrering genom att använda kommandon som wc, sort och grep.

Similar Posts

Lämna ett svar

Din e-postadress kommer inte publiceras.