Linux erbjuder en mångfald av sökverktyg, alla med sina egna fördelar. Vi kommer att utforska hur man använder `find`, `locate`, `which`, `whereis`, `whatis` och `apropos`. Var och en av dessa utmärker sig inom specifika områden, vilket gör det viktigt att välja rätt verktyg för uppgiften.
När det kommer till att söka och hitta filer i Linux, har du ett brett utbud av kommandon att välja mellan. Varför finns det så många? Jo, de har alla sina specialiteter och presterar bättre än de andra i vissa situationer. Du kan betrakta dem som en sorts schweizisk armékniv för sökning. Vi kommer att granska varje ”blad” i tur och ordning för att förstå deras unika styrkor.
`find`-kommandot
`find`-kommandots beteende kan vara svårt att förstå genom att bara gissa sig fram. Men när du väl lärt dig syntaxen, inser du dess kraft och flexibilitet.
Det enklaste sättet att använda `find` är att bara skriva `find` och trycka på Enter.
find
I det här fallet fungerar `find` som `ls`, men den listar alla filer i den aktuella katalogen samt i underkataloger.
Vissa versioner av `find` kräver att du anger `.` för den aktuella katalogen. Om det gäller din version av Linux, använd då det här kommandot:
find .
För att starta sökningen från rotkatalogen, använd det här kommandot:
find /
Om du vill börja sökningen i din hemkatalog, använd det här kommandot:
find ~
Använda `find` med filnamnsmönster
För att `find` ska vara mer än bara en återkommande version av `ls`, måste vi ge den något att söka efter. Vi kan ange filnamn eller filnamnsmönster. Mönster använder jokertecken, där `*` betyder en valfri teckensträng och `?` betyder ett valfritt enstaka tecken.
Mönster måste anges inom citattecken för att fungera korrekt. Det är lätt att glömma, men om du inte använder citattecken kommer jokertecknen inte att fungera som de ska.
Med det här kommandot kommer vi att söka i den aktuella katalogen efter filer som matchar mönstret ”*.*s”. Det betyder alla filnamn som har en filändelse som slutar på ”s”. Vi använder alternativet `-name` för att ange att vi skickar in ett filnamn eller ett filnamnsmönster.
find . -name "*.*s"
`find` returnerar de matchande filerna.
Notera att två av filändelserna är två tecken långa, medan en är tre tecken lång. Det beror på att vi använde mönstret ”*.*s”. Om vi bara hade velat se filändelser med två tecken hade vi använt ”*.?s”.
Om vi hade vetat att vi letade efter JavaScript-filer med ”.js”-ändelse, kunde vi ha varit mer specifika i vårt mönster. Notera också att du kan använda enkla citattecken för att omsluta mönstret om du föredrar det.
find . -name '*.js'
Nu listas endast JavaScript-filerna.
Ignorera skiftläge med `find`
Om du känner till namnet på filen du vill hitta, kan du skicka det till `find` istället för ett mönster. Du behöver inte omsluta filnamnet med citattecken om det inte innehåller jokertecken, men det är bra att alltid göra det. På så sätt glömmer du inte bort dem när du behöver dem.
find . -name 'Yelp.js'
Det gav inget resultat. Men det är konstigt, vi vet att filen finns där. Låt oss försöka igen och säga till `find` att ignorera skiftläge. Vi gör det med alternativet `-iname` (ignorera skiftlägesnamn).
find. -iname 'Yelp.js'
Det var problemet. Filnamnet börjar med gemenen ”y”, medan vi sökte med versalen ”Y”.
Återkommande underkataloger med `find`
En bra egenskap hos `find` är hur den rekursivt söker genom underkataloger. Låt oss söka efter alla filer som börjar med ”map”.
find . -name "map*.*"
De matchande filerna listas. Observera att de alla finns i en underkatalog.
Söka efter kataloger med `find`
Alternativet `-path` gör att `find` letar efter kataloger. Låt oss söka efter en katalog som vi inte riktigt minns namnet på, men vi vet att den slutar på bokstäverna ”om”.
find . -path '*about'
Katalogen hittas. Den heter bara ”om” och den är kapslad i en annan katalog i den aktuella katalogen.
Det finns ett `-ipath`-alternativ (ignorera skiftläge) som gör det möjligt att söka efter sökvägar och ignorera skiftläge, liknande alternativet `-iname` som diskuterades ovan.
Använda filattribut med `find`
`find` kan leta efter filer som har attribut som matchar sökningen. Du kan till exempel leta efter tomma filer med alternativet `-empty`, oavsett vad de heter.
find . -empty
Alla filer med noll byte kommer att listas i resultaten.
Alternativet `-executable` hittar alla filer som kan köras, till exempel ett program eller ett skript.
find . -executable
Resultaten listar en fil som heter ”fix_aptget.sh”.
De innehåller även tre kataloger, inklusive ”.”, den aktuella katalogen. Katalogerna inkluderas i resultaten eftersom körningsbiten är inställd i deras filbehörigheter. Utan detta skulle du inte kunna ”köra” dessa kataloger.
Alternativet `-type`
Alternativet `-type` gör att du kan söka efter typen av objekt du letar efter. Vi anger typindikatorn ”f” som parameter till alternativet `-type` eftersom vi bara vill söka efter filer.
find . executable -type f
Den här gången listas inte underkatalogerna. Den körbara skriptfilen är det enda objektet i resultaten.
Vi kan också be `find` att bara inkludera kataloger i resultaten. För att lista alla kataloger kan vi använda alternativet `-type` med typindikatorn ”d”.
find . type -d
Endast kataloger och underkataloger listas i resultaten.
Använda andra kommandon med `find`
Du kan utföra ytterligare åtgärder på de filer som hittas. Du kan i sin tur skicka filerna till ett annat kommando.
Om vi behöver säkerställa att det inte finns några körbara filer i den aktuella katalogen och underkatalogerna, kan vi använda följande kommando:
find . -name "fix_aptget.sh" -exec chmod -x '{}' ;
Kommandot betyder:
Sök i den aktuella katalogen efter ett namngivet objekt som heter ”fix_aptget.sh”.
Om det hittas, kör kommandot `chmod`.
Parametrarna som skickas till `chmod` är `-x` för att ta bort körbara behörigheter och `{}` som representerar filnamnet för den hittade filen.
Det sista semikolonet markerar slutet på parametrarna som skickas till `chmod`. Det måste ”escapas” med ett omvänt snedstreck.
Efter att kommandot har körts kan vi söka efter körbara filer som tidigare, men den här gången kommer inga filer att listas.
För att göra sökningen bredare kan vi använda ett filnamnsmönster istället för filnamnet i exemplet.
Denna flexibilitet ger dig möjlighet att söka efter specifika filtyper eller använda filnamnsmönster och få vissa åtgärder utförda på de matchande filerna.
`find` har många andra alternativ, inklusive sökning efter filer baserat på ändringsdatum, ägare (användare eller grupp), läsbarhet eller specifika filbehörigheter.
Kommandona `locate` och `mlocate`
Många Linux-distributioner använde tidigare en version av `locate`. Den ersattes av kommandot `mlocate`, som var en förbättrad och uppdaterad version av `locate`.
När `mlocate` är installerat på ett system ändrar det kommandot `locate` så att du faktiskt använder `mlocate` även om du skriver `locate`.
Aktuella versioner av Ubuntu, Fedora och Manjaro kontrollerades för att se om de hade versioner av dessa kommandon förinstallerade. Ubuntu och Fedora inkluderade båda `mlocate`. Det måste installeras på Manjaro med det här kommandot:
sudo pacman -Syu mlocate
På Ubuntu kan du använda `locate` och `mlocate` omväxlande. På Fedora och Manjaro måste du skriva `locate`, men kommandot körs av `mlocate`.
Om du använder alternativet `–version` med `locate`, ser du att kommandot som svarar faktiskt är `mlocate`.
locate --version
Eftersom `locate` fungerar på alla Linux-distributioner som testades, kommer vi att använda `locate` i våra förklaringar nedan. Och det är en bokstav mindre att skriva.
`locate`-databasen
Den största fördelen med `locate` är dess snabbhet.
När du använder kommandot `find`, gör den en sökning i ditt filsystem. Kommandot `locate` fungerar väldigt annorlunda. Den gör en databassökning för att avgöra om det du letar efter finns på din dator. Det gör sökningen mycket snabbare.
Det väcker en uppenbar fråga om databasen. Vad säkerställer att databasen är uppdaterad? När `mlocate` är installerat, placerar den (vanligtvis) en post i `cron.daily`. Denna körs varje dag (mycket tidigt på morgonen) och uppdaterar databasen.
För att kontrollera om denna post finns, använd det här kommandot:
ls /etc/cron.daily/*loc*
Om du inte hittar en post där, kan du ställa in en automatisk uppgift för att göra detta åt dig vid den tid du väljer.
Vad händer om din dator inte är på när databasen ska uppdateras? Du kan köra databasuppdateringsprocessen manuellt med det här kommandot:
sudo updatedb
Använda `locate`
Låt oss leta efter filer som innehåller strängen ”getlatlong”. Med `locate` söker den automatiskt efter alla matchningar som innehåller söktermen var som helst i filnamnet, så du behöver inte använda jokertecken.
locate getlatlong
Det är svårt att förmedla snabbheten i en skärmdump, men de matchande filerna visas nästan omedelbart.
Bestämma antalet `locate`-resultat
Ibland vet du att det finns många filer av den typ du letar efter. Du behöver bara se de första. Kanske vill du bara påminnas om vilken katalog de finns i och behöver inte se alla filnamn.
Med alternativet `-n` (nummer) kan du begränsa antalet resultat som `locate` returnerar. I det här kommandot har vi satt en gräns på 10 resultat.
locate .html -n 10
`locate` svarar genom att lista de 10 första matchande filnamnen som den hämtar från databasen.
Räkna matchande filer
Om du bara vill veta antalet matchande filer och inte behöver veta vad de heter eller var de finns på din hårddisk, använd alternativet `-c` (count).
locate -c .html
Nu vet vi att det finns 431 filer med ändelsen ”.html” på den här datorn. Vi kanske vill ta en titt på dem, men vi tänkte kolla hur många det var först. Med den kunskapen vet vi att vi behöver filtrera resultatet.
locate .html | less
Och här är de alla, eller åtminstone, här är toppen av den långa listan över dem.
Ignorera skiftläge med `locate`
`-i` (ignorera skiftläge) får `locate` att göra just det. Det ignorerar skillnader mellan versaler och gemener i söktermen och filnamnen i databasen. Om vi försöker räkna HTML-filerna igen, men av misstag anger söktermen med versaler, får vi noll resultat.
locate -c .HTML
Genom att inkludera alternativet `-i` kan vi få `locate` att ignorera skillnaden i skiftläge och returnera det förväntade svaret, 431.
locate -c -i .HTML
Hitta databasstatus
För att se databasens status, använd alternativet `-s` (status). Detta gör att `locate` returnerar statistik om databasens storlek och innehåll.
locate -s
`which`-kommandot
Kommandot `which` söker igenom katalogerna i din $PATH och försöker hitta kommandot du letar efter. Det låter dig bestämma vilken version av ett program eller kommando som kommer att köras när du skriver namnet på kommandoraden.
Tänk dig att vi hade ett program som heter `geoloc`. Vi vet att det är installerat på datorn, men vi vet inte var det finns. Det måste finnas någonstans i sökvägen, för när vi skriver namnet körs det. Vi kan använda `which` för att hitta det med det här kommandot:
which geoloc
Det rapporterar att programmet finns i `/usr/local/bin`.
Vi kan kontrollera om det finns andra kopior av programmet på andra ställen i sökvägen genom att använda alternativet `-a` (alla).
which -a geoloc
Det visar oss att vi har programmet `geoloc` på två ställen.
Självklart kommer kopian i `/usr/local/bin` att hittas först av Bash-skalet, så att ha programmet på två ställen är meningslöst.
Om du tar bort versionen i `/usr/bin/geoloc` sparar du lite diskutrymme. Ännu viktigare, du undviker också problem som uppstår när någon uppdaterar programmet manuellt på fel ställe. Då undrar de varför de inte ser de nya uppdateringarna när de kör programmet.
`whereis`-kommandot
Kommandot `whereis` liknar `which`, men det ger mer information.
Förutom platsen för kommandot eller programfilen, rapporterar `whereis` också var manualsidorna och käll