Hitta filer och kataloger på Linux med kommandot Sök | Opensource.com
oavsett hur organiserad jag bestämmer mig för att vara, verkar det alltid finnas tillfällen när jag bara inte kan hitta en fil. Ibland beror det på att jag inte kommer ihåg namnet på filen i första hand. Andra gånger vet jag namnet, men jag kan inte komma ihåg var jag bestämde mig för att spara det. Det finns även tillfällen när jag behöver en fil som jag inte skapade i första hand. Oavsett vad quandary, men jag vet att på ett POSIX-system har jag alltid kommandot find
.
Installera Sök
kommandot find
definieras av POSIX-specifikationen, vilket skapar den öppna standarden med vilken POSIX-system (inklusive Linux, BSD och macOS) mäts. Enkelt uttryckt har du redan find
installerat så länge du kör Linux, BSD eller macOS.
men inte alla find
kommandon är exakt lika. Kommandot GNU find
har till exempel funktioner som kommandot BSD eller Busybox eller Solaris find
kanske inte har eller har men implementerar annorlunda. Den här artikeln använder GNU find
från findutils-paketet eftersom det är lätt tillgängligt och ganska populärt. De flesta kommandon som visas i den här artikeln fungerar med andra implementeringar av find
, men om du försöker ett kommando på en annan plattform än Linux och får oväntade resultat, försök ladda ner och installera GNU-versionen.
hitta en fil med namn
du kan hitta en fil med dess filnamn genom att ange det fullständiga filnamnet eller delar av filnamnet med reguljära uttryck. Kommandot find
kräver sökvägen till katalogen du vill söka i, alternativ för att ange vilket attribut du söker (till exempel –name
för ett skiftlägeskänsligt filnamn) och sedan söksträngen. Som standard behandlas din söksträng bokstavligen: kommandot find
söker efter ett filnamn som är exakt den sträng du anger mellan citat om du inte använder syntax för reguljära uttryck.
Antag att din Dokumentkatalog innehåller fyra filer: Foo
, foo
, foobar.txt
, och foo.xml
. Här är en bokstavlig sökning efter en fil med namnet “foo”:
$ find ~ -name "foo"
/home/tux/Documents/examples/foo
du kan bredda din sökning genom att göra den skiftlägeskänslig med alternativet -iname
:
$ find ~ -iname "foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
jokertecken
du kan använda basic shell jokertecken för att bredda din sökning. Till exempel representerar asterisken (*
) valfritt antal tecken:
$ find ~ -iname "foo*"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt
ett frågetecken (?
) representerar ett enda tecken:
$ find ~ -iname "foo*.???"
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt
det här är inte syntax för reguljära uttryck, så punkten (.
) representerar en bokstavlig punkt i det här exemplet.
reguljära uttryck
du kan också använda reguljära uttryck. Som med -iname
och -name
finns det både ett skiftlägeskänsligt och ett skiftlägeskänsligt alternativ. Till skillnad från alternativen -name
och -iname
tillämpas dock en -regex
och -iregex
– sökning på hela sökvägen, inte bara filnamnet. Det betyder att om du söker efter foo
får du inga resultat eftersom foo
inte matchar /home/tux/Documents/foo
. Istället måste du antingen söka efter hela sökvägen eller använda en jokerteckensekvens i början av strängen:
$ find ~ -iregex ".*foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
hitta en fil ändrad under den senaste veckan
för att hitta en fil som du senast ändrade förra veckan, använd alternativet -mtime
tillsammans med ett (negativt) antal dagar tidigare:
$ find ~ -mtime -7
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt
hitta en fil ändrad inom ett intervall på dagar
du kan kombinera -mtime
alternativ för att hitta en fil inom ett intervall på dagar. För det första -mtime
– argumentet, ange det senaste antalet dagar du kunde ha ändrat filen och för det andra ge det största antalet dagar. Till exempel söker den här sökningen efter filer med modifieringstider mer än en dag tidigare, men inte mer än sju:
$ find ~ -mtime +1 -mtime -7
begränsa en sökning efter filtyp
det är vanligt att optimera resultaten av find
genom att ange den filtyp du letar efter. Du bör inte använda det här alternativet om du inte är säker på vad du letar efter, men om du vet att du letar efter en fil och inte en katalog, eller en katalog men inte en fil, kan det här vara ett bra filter att använda. Alternativet är -type
, och dess argument är en bokstavskod som representerar några olika typer av data. De vanligaste är:
-
d
– katalog -
f
– fil -
l
– symbolisk länk -
s
– socket -
p
– namngivna rör (används för FIFO) -
b
– block special (vanligtvis en hårddiskbeteckning)
här är några exempel:
$ find ~ -type d -name "Doc*"
/home/tux/Documents
$ find ~ -type f -name "Doc*"
/home/tux/Downloads/10th-Doctor.gif
$ find /dev -type b -name "sda*"
/dev/sda
/dev/sda1
justera omfattning
kommandot find
är rekursivt som standard, vilket innebär att det söker efter resultat i katalogerna för kataloger som finns i kataloger (och så vidare). Detta kan bli överväldigande i ett stort filsystem, men du kan använda alternativet -maxdepth
för att styra hur djupt in i din mappstruktur du vill att find
ska sjunka:
$ find /usr -iname "*xml" | wc -l
15588
$ find /usr -maxdepth 2 -iname "*xml" | wc -l
15
du kan växelvis ställa in minsta rekursionsdjup med -mindepth
:
$ find /usr -mindepth 8 -iname "*xml" | wc -l
9255
ladda ner fuskbladet
den här artikeln täcker bara de grundläggande funktionerna för find
. Det är ett bra verktyg för att söka igenom ditt system, men det är också en riktigt användbar front-end för det kraftfulla parallella kommandot. Det finns många anledningar att lära sig find
, så ladda ner vårt gratis find
fuskblad för att hjälpa dig att lära dig mer om kommandot.
Leave a Reply