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.
Gör följande:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-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:
grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
Detta kommer att utesluta sökning av alla filer som slutar med .o-tillägget:
grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
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/:
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
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
:
grep -Ril "text-to-find-here" /
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:
ack 'text-to-find-here'
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.