Hur hittar jag alla filer som innehåller en viss text i Linux?
Jag försöker hitta ett sätt att söka igenom hela mitt Linux-system efter alla filer som innehåller en viss textsträng. För att förtydliga, jag letar efter text i filen, inte i filnamnet.
När jag letade efter hur man gör detta, stötte jag på den här lösningen två gånger:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Det fungerar dock inte. Den verkar visa varje enskild fil i systemet.
Är detta nära det rätta sättet att göra det på? Om inte, hur ska jag göra? Denna förmåga att hitta textsträngar i filer skulle vara utomordentligt användbar för några programmeringsprojekt jag håller på med.
4881
3
Gör följande:
-r
eller-R
är rekursivt,-n
är linjenummer, och-w
står för att matcha hela ordet.-l
(L med små bokstäver) kan läggas till för att bara ange filnamnet på matchande filer.Tillsammans med dessa kan flaggor som
--exclude
,--include
,--exclude-dir
användas för effektiv sökning:Detta kommer endast att söka igenom de filer som har .c eller .h-tillägg:
Detta kommer att utesluta sökning av alla filer som slutar med .o-tillägget:
För kataloger är det möjligt att utesluta en viss katalog (eller vissa kataloger) med hjälp av parametern
--exclude-dir
. Detta kommer till exempel att utesluta katalogerna dir1/, dir2/ och alla kataloger som matchar *.dst/:Detta fungerar mycket bra för mig, för att uppnå nästan samma syfte som ditt.
Fler alternativ finns i
man grep
.Du kan använda
grep -ilR
:i
står för ignorera fall (valfritt i ditt fall).R
står för rekursiv.l
står för "visa filnamnet, inte själva resultatet"./
står för att börja vid roten på din maskin.Du kan använda ack. Det är som grep för källkod. Du kan skanna hela ditt filsystem med den.
Gör bara:
I din rotkatalog.
Du kan också använda reguljära uttryck, ange filtyp osv.
UPDATE
Jag upptäckte just The Silver Searcher, som är som ack men 3-5x snabbare än det och som till och med ignorerar mönster från en
.gitignore
-fil.