Hvordan finner jeg alle filer som inneholder en bestemt tekst på Linux?

Jeg prøver å finne en måte å skanne hele Linux-systemet mitt for alle filer som inneholder en bestemt tekststreng. Bare for å presisere, jeg leter etter tekst i filen, ikke i filnavnet.

Da jeg lette etter en måte å gjøre dette på, kom jeg over denne løsningen to ganger:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Den fungerer imidlertid ikke. Den ser ut til å vise hver eneste fil i systemet.

Er dette i nærheten av riktig måte å gjøre det på? Hvis ikke, hvordan skal jeg gjøre det? Denne muligheten til å finne tekststrenger i filer ville vært svært nyttig for noen programmeringsprosjekter jeg holder på med.

Løsning

Gjør følgende:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r eller -R er rekursiv,
  • -n er linjenummer, og
  • -w står for å matche hele ordet.
  • -l (L med liten forbokstav) kan legges til for å angi filnavnet til de matchende filene.

I tillegg til disse kan flaggene --exclude, --include, --exclude-dir brukes for effektiv søking:

  • Dette vil bare søke gjennom de filene som har filtypene .c eller .h:

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
  • Dette vil utelukke søk i alle filer som slutter med .o:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
  • For kataloger er det mulig å ekskludere en bestemt(e) katalog(er) ved hjelp av parameteren --exclude-dir. Dette vil for eksempel ekskludere katalogene dir1/, dir2/ og alle som samsvarer med *.dst/:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"

Dette fungerer veldig bra for meg, for å oppnå nesten samme formål som ditt.

For flere alternativer, se man grep.

Kommentarer (36)

Du kan bruke grep -ilR:

grep -Ril "text-to-find-here" /
  • i står for ignore case (valgfritt i ditt tilfelle).
  • R står for rekursiv.
  • l står for "vis filnavnet, ikke selve resultatet".
  • / står for å starte ved roten av maskinen din.
Kommentarer (29)

Du kan bruke ack. Det er som grep for kildekode. Du kan skanne hele filsystemet ditt med den.

Bare gjør det:

ack 'text-to-find-here'

I rotkatalogen din.

Du kan også bruke regulære uttrykk, angi filtype osv.


**OPPDATERING

Jeg oppdaget nettopp The Silver Searcher, som er som ack, men 3-5 ganger raskere og til og med ignorerer mønstre fra en .gitignore-fil.

Kommentarer (3)