Utforska kraften i kommandot ’find’ i Linux
Kommandot ’find’ i Linux är ett mycket användbart verktyg som ger systemadministratörer möjligheten att lokalisera och hantera filer samt kataloger baserat på ett stort antal sökparametrar. Det möjliggör sökning efter kataloger och filer med hjälp av deras namn, typ, filändelse, storlek, rättigheter och mycket mer.
Utöver att endast hitta filer och kataloger, kan sökkommandot kombineras med andra kommandon för att utföra åtgärder på de matchande resultaten. Genom att använda flaggan ’-exec’ kan systemadministratörer köra externa kommandon och därmed utföra operationer som kopiering, flyttning, radering eller ändring av rättigheter för filerna som motsvarar de angivna kriterierna, såsom storlek eller namn.
I den här artikeln kommer vi att inledningsvis undersöka grundläggande Linux sökkommandon med olika exempel. Detta kommer att visa dig hur man hittar filer och kataloger. Vi kommer sedan att demonstrera hur du kan använda flaggan ’-exec’ för att vidta åtgärder på filer eller kataloger beroende på deras storlek, rättigheter med mera.
Den generella syntaxen för ’find’-kommandot är:
find {sökväg} {namn-på-fil-eller-katalog-att-söka} {åtgärd-att-vidta}
Där:
- sökväg: anger den katalog som ska sökas igenom.
- namn-på-fil-eller-katalog-att-söka: Namnet på filen eller katalogen som ska lokaliseras.
- åtgärd-att-vidta: Det kommando som ska utföras, t.ex. kopiera, ta bort eller flytta.
I den här guiden kommer vi att klargöra hur man hittar filer och kataloger som matchar definierade mönster. Vi kommer också att demonstrera hur man utför operationer på de filer eller kataloger som kommandot ’find’ hittar. Den här guiden är baserad på Ubuntu men fungerar med de flesta Linux-distributioner och versioner.
Lokalisera filer och kataloger
Hitta specifika filer efter namn eller filändelse
För att leta efter en specifik fil, kör följande kommando från rotkatalogen (/). Kommandot inkluderar det exakta namnet på den fil du söker.
find . -name file22.txt
Exempel på utdata:
./test/file22.txt ./sales/file22.txt
Lägg märke till att resultaten inkluderar sökvägen. Detta är viktigt om du inte vet katalogen där filen finns, eller om den finns på flera ställen.
Du kan också leta efter filen i en annan katalog medan du befinner dig på den aktuella platsen. I det här fallet måste du specificera sökvägen till den katalog du vill söka i.
find ./test -name file22.txt
Sök efter specifika filer i en annan katalog
I vårt exempel kommer vi att leta efter allt som börjar med bokstäverna ’file’ i katalogen ’test’.
find ./test -name file*
Exempel på utdata:
./test/file22.txt ./test/file30.doc ./test/file1.txt ./test/file5.doc
Sök efter filer med en specifik filändelse
För att hitta en fil i Linux med en viss filändelse, lägg till den i kommandot.
find . -name *.txt
Exempel på utdata:
./test/subtest/subfil.txt ./test/file22.txt ./test/file1.txt ./home1/files32.txt ./home2/file22.txt ./qa/tags.txt
Hitta filer och kataloger efter namn
Använd följande kommando för att leta efter filer och kataloger som börjar med bokstäverna ’qa’. I vår miljö har vi filerna ’qatree.txt’ och ’qa.txt’ samt en katalog med namnet ’qa’.
Om vi kör kommandot:
find ./ -name "qa*"
Returneras följande utdata:
./test/qatree.pdf ./test/qa.txt ./home/qa
Kommandot returnerar både filer och kataloger som matchar sökparametrarna. För att endast hitta filer eller kataloger måste du ange detta i kommandot.
Hitta endast filer eller kataloger
För att söka endast efter filer, använd flaggan ’-type f’.
Endast filer:
find ./ -type f -name "qa*"
Exempel på utdata:
./test/qatree.pdf ./test/qa.txt
Endast kataloger:
Lägg till flaggan ’-type d’ för att endast hitta kataloger.
find ./ -type d -name "qa*"
Exempel på utdata:
./home/qa
Skiftlägesokänslig sökning
Alla sökningar med flaggan ’-name’ är skiftlägeskänsliga och ger inte resultat med stora bokstäver. För att få alla fall, använd flaggan ’-iname’.
find ./ -iname "qa*"
Exempel på utdata:
./test/qatree.pdf ./test/qa.txt ./test/QAtest.txt ./home/qa
Sök efter en fil i flera kataloger
För att hitta filer i olika kataloger, lägg till deras sökvägar i kommandot. I vårt fall kommer vi att kolla katalogerna ’test’ och ’numeric’.
find ./test ./numeric -name file22.txt -type f
Exempel på utdata:
./test/file22.txt /root/numeric/file22.txt
Hitta flera filer med olika filändelser från alla kataloger
Du kan använda kommandot ’find’ för att hitta flera filer som delar olika filändelser, såsom *.doc, *.txt, *.pdf och så vidare. Detta kan göras separat, en filändelse i taget, eller med ett enda kommando som inkluderar alla önskade filändelser.
Exempel:
find . -type f \( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" \)
Exempel på utdata:
./test/subtest/subfil.txt ./test/qatree.pdf ./test/file22.txt ./test/qa.txt ./test/file30.doc ./books/acro.pdf ./data1/FILE22.txt ./docs/files32.txt
Hitta filer som innehåller viss text
Ibland kan du behöva hitta en fil som innehåller viss text men du kanske inte kommer ihåg filnamnet eller dess placering. Detta kommando låter dig hitta alla filer som innehåller din måltext.
För att leta efter alla filer som innehåller ordet ”hyperkonvergens”, använd:
find / -type f -exec grep -l -i "hyperconvergence" {} ;
Exempel på utdata:
/root/numeric/hci /root/HCIP
Flaggan ’-i’ gör att kommandot ignorerar skiftlägeskänsligheten och hittar texten oavsett om den är med stora eller små bokstäver, dvs. hyperkonvergens, Hyperkonvergens och så vidare.
För att leta efter filerna i en specifik katalog, lägg helt enkelt till dem i kommandot.
find ./numeric -type f -exec grep -l -i "hyperconvergence" {} ;
Exempel på utdata:
./numeric/hci
Utforska fler exempel på kommandot grep.
Hitta filer och kataloger baserat på storlek
Du kan hitta alla filer eller kataloger som är mindre, lika med eller större än en viss storlek, inom ett visst intervall eller som är tomma. Använd lämplig storleksenhet beroende på vilken typ av filer eller kataloger du letar efter.
Storleksenheter som kan användas är:
c – byte
k – kilobyte
M – Megabyte
G – Gigabyte
Hitta filer av en viss storlek – lika med 30 MB
För att hitta alla filer som är 30MB:
find / -size 30M
Hitta filer som är större än en angiven storlek
find -size +2M
Exempel på utdata:
./Downloads/ubuntu18043.iso ./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f414305057 7a9c
Hitta filer som är mindre än 10 MB i den aktuella katalogen
find . -type f -size -10M
Hitta filer med storlekar mellan 100-200MB
När du letar efter filer inom ett specifikt intervall, som mellan 100 och 200 MB:
find / -size +100M -size -200M
Leta efter kataloger som är större än 20 kb
find / -type d -size +20k
Hitta tomma filer och kataloger.
Filer:
find ./ -type f -size 0
eller:
find ./ -type f --empty
Kataloger:
find ./ -type d --empty
Hitta filer efter ålder eller ändringstid
Hitta filer som är äldre än n dagar:
find /path/ -type f -name '*.txt' -mtime +8
-mtime +8 kommer att leta efter txt-filer som är äldre än 8 dagar.
Efter ändringsdatum
Detta kommer att leta efter filer som har ändrats inom de senaste 17 timmarna.
find . -mtime -17 -type f
Söker efter kataloger som har ändrats under de senaste 10 dagarna:
find . -mtime -10 -type d
Hitta filer baserat på åtkomst eller ändring
Hitta filer baserat på datum eller tid för åtkomst. Detta låter dig se filer som har, eller inte har, öppnats inom en viss tidsperiod.
För att se filer som inte har öppnats under de senaste 10 dagarna i hemkatalogen:
find /home -atime +10
Filer som öppnades för exakt 10 dagar sedan:
find /home -atime 10
Filer som öppnades inom de senaste 10 dagarna:
find /home -atime -10
Hitta filer som har ändrats under de senaste n dagarna
Du kan också leta efter filer i katalogen /home som ändrats under de senaste 10 dagarna med kommandot:
find /home -mtime -10
Hitta filer som ändrats inom en viss period
Till exempel, alla filer som ändrades för mellan 6 och 15 dagar sedan i hemkatalogen:
find /home -type f -mtime +6 -mtime -15
Filer och kataloger som öppnats inom de senaste 10 minuterna
Använd flaggan -amin för att hitta filer som har öppnats under de senaste 10 minuterna.
find . -amin -10 -type f
Exempel på utdata:
./.bash_history ./[email protected]:~#
Kataloger som öppnats under de senaste 10 minuterna:
find . -amin -10 -type d
Hitta filer som matchar specifika rättigheter
Syntax:
$ find -perm mode
Där ’mode’ är de rättigheter som antingen är numeriska, som 644, 655, 700, 777 osv., eller med bokstäver, som u=x, a=r+x, osv.
Du kan specificera rättigheterna på följande tre olika sätt:
Hitta filer med rättighet 777
find -perm 777
Exempel på utdata:
./file1
Hitta filer med minst 766:
find -perm -766
Exempel på utdata:
./file2 ./file1
Kommandot söker efter alla filer där:
- Filägaren har läs-, skriv- och körbehörighet.
- Gruppen har läs- och skrivbehörighet.
- Andra har läs- och skrivbehörighet.
Som sådan returneras två filer som uppfyller detta kriterium – file1 och file2. Filerna behöver inte ha de exakta 766-behörigheterna utan kan ha ytterligare sådana så länge de har minst de angivna.
Hitta filer som kan skrivas av ägaren
Vi kommer nu att använda ”/” för att leta efter filer som kan skrivas antingen av deras ägare, grupp eller andra.
find -perm /222
Exempel på utdata:
. ./file2 ./file3 ./file1
Ovanstående letar efter filer som kan skrivas av antingen deras ägare eller grupp.
Detta returnerar filer som kan skrivas av antingen den ena eller den andra, men inte nödvändigtvis båda. För att se filer där båda har skrivbehörighet, använd prefixet ”-”.
find -perm -220
Exempel på utdata:
./file2 ./file1
Hitta filer som ägs av en användare
Hitta alla filer som ägs av Jack:
find /home -user jack
Exempel på utdata:
/home/jack /home/jack/examples.desktop /home/jack/.gnupg /home/jack/.gnupg/private-keys-v1.d /home/jack/ans.cgi
Hitta specifika filer som ägs av en användare
Hitta alla textfiler som ägs av Jack:
find /home -user jack -iname "*.txt"
Exempel på utdata:
/home/jack/docs/file32.txt
Hitta och lista filer och kataloger tillsammans med deras rättigheter
find -name "*.conf" | ls -l
Exempel på utdata:
total 120 drwxr-xr-x 2 root root 4096 Dec 31 13:19 backup2 drwxr-xr-x 2 root root 4096 Jan 4 11:57 Desktop drwxr-xr-x 2 root root 4096 Dec 31 11:50 Documents drwxr-xr-x 2 root root 4096 Dec 31 12:27 Downloads -rw-r--r-- 1 root root 0 Jan 4 12:02 file22.doc drwxr-xr-x 2 root root 4096 Jan 4 12:14 file23 -rw-r--r-- 1 root root 0 Jan 4 12:23 file23.txt
Hitta och agera på resultaten
I det här avsnittet kommer vi att undersöka hur du kan agera på de filer som matchar det mönster som anges i kommandot ’find’.
Hitta filer och ändra rättigheter
Hitta och ändra rättigheter för vissa filtyper. I vårt exempel kommer vi att arbeta med PHP-filer med olika rättigheter som visas nedan.
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 vary.php
Vi kommer nu att leta efter alla PHP-filer (ovan) och ersätta deras rättigheter med 755.
find ver -name "*.php" -type f -exec chmod 755 {} ;
Kommandot söker efter PHP-filer i ’ver’-katalogen och ställer sedan in deras rättighet till 755 (rwxr-xr-x).
Resultat:
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 vary.php
Hitta och ändra fil- och katalogrättigheter
Hitta filer med 644 rättigheter och ändra dem till att ha 655 rättigheter:
find . -type f -perm 644 -exec chmod 655 {} ;
Du kan också leta efter kataloger med 644 rättigheter och ersätta detta med 755.
find . -type d -perm 644
Exempel på utdata:
./docs
Katalogen ’docs’ har 644 rättigheter.
drwxrwxr-x 2 jack jack 4096 Jan 3 12:45 docs
För att ställa in den till 755 kör vi:
find . -type d -perm 644 -exec chmod 755 {} ;
Nu kan vi kolla igen för att se vad som ändrats till 755:
find . -type d -perm 755
Exempel på utdata:
. ./docs
Ovanifrån kan vi se att rot- och dokumentkatalogerna har 755 rättigheter.
Kommandot ’ls -la’ ger följande detaljer:
drwxr-xr-x 2 jack jack 4096 Jan 3 12:45 docs
Hitta och kopiera filer eller kataloger
Hitta och kopiera en specifik fil till en katalog:
Kommandot nedan hittar filen ’file22.txt’ och kopierar den till katalogen ’~/tmp/images’.
find -iname file22.txt -exec cp {} ~/tmp/images ;
Hitta och kopiera en typ av filer till en katalog:
För att hitta filer som är bilder med filändelsen ’jpg’ i den aktuella katalogen och kopiera dem till en annan plats som en bildmapp, använd:
find -iname '*.jpg' -exec cp {} ~/tmp/images ;
Detta kommer att hitta och kopiera alla ’jpg’-filer till mappen ’~/tmp/images’.
Hitta och kopiera en fil till många kataloger
Hitta och kopiera en fil till flera kataloger:
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;
Detta kommer att hitta filen ’hci’ och kopiera den till de tre katalogerna ’/tmp/dir1/’, ’/tmp/dir2/’ och ’$HOME/3/’.
Hitta och flytta filer till en annan katalog
För att flytta en känd fil från en katalog till en annan. För att flytta filen ’universal.php’:
find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;
Sök och flytta filer med en viss filändelse till en annan mapp:
find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;
Hitta vissa filer och flytta till en specifik annan mapp
find -type f -name uni*.* -exec mv {} ~/unifiles/ ;
Kommandot söker efter alla filer som börjar med namnet ’uni’ och har valfri filändelse. Det flyttar dem sedan till katalogen ’/unifiles/’.
Hitta och flytta filer baserat på ålder
Hitta och flytta filer som är äldre än ett angivet antal dagar till en annan plats, till exempel till arkivet:
find /path/ -type f -name '*.pdf' -mtime +20 -exec mv {} /backup1/ ;
Detta kommer att söka efter pdf-filer som är äldre än 20 dagar och flytta dem till katalogen ’backup1’.
Hitta och ta bort filer och kataloger
Syntaxen för att hitta och ta bort filer eller kataloger i den aktuella katalogen är:
find . -type f -name "fil-att-radera" -exec rm -f {} ;
för att endast ta bort filer, eller:
find . -type d -name "katalog-att-radera" -exec rm -rf {} ;
för att endast ta bort kataloger.
Hitta och radera endast specifika filer
För att hitta och ta bort filer som börjar med ’til’, använd:
find . -type f -name "til*" -exec rm {} ;
För att hitta och ta bort kataloger som börjar med ’til’:
find . -type d -name "til*" -exec rm {} ;
Ta bort både filer och kataloger
find . -name "til*" -exec rm -rf {} ;
Detta tar bort både filer och kataloger som börjar med bokstäverna ’til’.
Radera baserat på filändelse
Nedan visas hur du kan hitta och ta bort alla txt-filer i den aktuella katalogen. Ersätt filändelsen ’txt’ med en annan filändelse, som ’bak’, ’pdf’ eller något annat som du vill ta bort.
find . -type f -name "*.txt" -exec rm -f {} ;
Om du vill att systemet ska be dig bekräfta innan du tar bort varje fil, lägg till flaggan ’-i’ enligt nedan:
find . -type f -name "*.txt" -exec rm -i {} ;
Exempel på utdata:
rm: remove regular empty file './File22.txt'? y rm: remove regular empty file './file22.txt'? y rm: remove regular empty file './file23.txt'?
Som standard tar ’-rm’ inte bort kataloger, och du måste använda flaggan ’-r’ för att säkerställa en rekursiv radering. Detta säkerställer radering av tomma kataloger och de som innehåller filer. Flaggan ’-f’ tvingar fram borttagningen och används för både filer och kataloger.
Hitta och ta bort filer äldre än n dagar
Hitta och ta bort säkerhetskopior som är äldre än 20 dagar från den aktuella katalogen.
find . -type f -name '*.bak' -mtime +20 -exec rm {} ;
Detta tar bort alla .bak-filer som är äldre än 20 dagar.
Hitta och radera endast kataloger
För att radera en katalog som heter ’dir22’:
find . -type d -name dir22 -exec rm -rf {} ;
Se till att du matchar katalogens namn med rätt skiftläge, eller använd flaggan ’-iname’.
find . -type d -iname Dir22 -exec rm -rf {} ;
Detta tar bort både ’Dir22’ och ’dir22’.
För att bekräfta innan radering, använd flaggan ’-i’.
find . -type d -iname Dir22 -exec rm -rf -i {} ;
Exempel på utdata:
rm: ta bort katalogen './Dir22'? n rm: ta bort katalogen './dir22'? y
I vårt exempel skrev vi ’n’ för katalogen ’Dir22’, som inte kommer att tas bort, och ’y’ för katalogen ’dir22’ som nu kommer att tas bort.
Hitta och ta bort tomma filer
Du kan använda något av följande kommandon för att hitta tomma filer och ta bort dem automatiskt.
find ./ -type f -size 0 -exec rm -f {} ;
eller:
find ./ -type f -size 0 | xargs rm -f
eller:
find ./ -type f -size 0 -delete
Hitta och ta bort tomma kataloger
För att ta bort tomma kataloger använder vi flaggan ’d’.
find ./ -type d -empty -exec rmdir {} ;
Ett annat alternativ är att använda ’-delete’ istället för ’-rmdir’.
find ./ -type d -empty -delete
Observera att radering av systemfiler eller viktiga filer från din dator kan skada operativsystemet eller applikationerna, eller leda till förlust av viktig data.
För att undvika oavsiktliga raderingar är det bäst att använda ett användarkonto som inte är ’root’. Se också till att du tar bort rätt filer som inte är användbara, och att du har en säkerhetskopia av alla dina datafiler för säkerhets skull.
Vad händer nu?
Varsågod och prova ovanstående Linux-sökkommandon i din testmiljö eller icke-produktionsmiljö. Se om du kan använda några av dem för att automatisera rensningen av filsystemet med hjälp av Crontab. Och för att bemästra Linux, kolla in den här onlinekursen.