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.

Lösning

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.

Kommentarer (36)

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.
Kommentarer (29)

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.

Kommentarer (3)