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 foointe 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