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
ochcd
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
Output1111Detta ä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/file1Det ä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 ha664
-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 kommandotlocate
. 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 änfind
ä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 aktuellalocate
-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
OutputDatabase /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store databaseSlutsats
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
ochgrep
.