Jeg forsøger at finde en måde at scanne hele mit Linux-system for alle filer, der indeholder en bestemt tekststreng. Bare for at præcisere, jeg leder efter tekst i filen, ikke i filnavnet.
Da jeg søgte efter hvordan man gør dette, stødte jeg på denne løsning to gange:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Men det virker ikke. Det ser ud til at vise hver eneste fil i systemet.
Er dette tæt på den rigtige måde at gøre det på? Hvis ikke, hvordan skal jeg så gøre? Denne evne til at finde tekststrenge i filer ville være ualmindelig nyttig for nogle programmeringsprojekter, jeg er i gang med.
Gør følgende:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
eller -R
er rekursiv,-n
er linjenummer, og-w
står for at matche hele ordet.-l
(lille L) kan tilføjes for blot at angive filnavnet på de matchende filer.Sammen med disse kan --exclude
, --include
, --exclude-dir
-flagene bruges til effektiv søgning:
Dette vil kun søge i de filer, der har .c eller .h-udvidelser:
grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
Dette vil udelukke søgning i alle filer, der slutter med .o-udvidelsen:
grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
For mapper er det muligt at udelukke en bestemt mappe eller mapper via parameteren --exclude-dir
. Dette vil f.eks. udelukke dir'erne dir1/, dir2/ og alle dem, der matcher *.dst/:
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
Dette virker meget godt for mig, for at opnå næsten det samme formål som dit.
For flere muligheder, se man grep
.
Du kan bruge grep -ilR
:
grep -Ril "text-to-find-here" /
i
står for ignorere tilfælde (valgfrit i dit tilfælde). R
står for rekursiv. l
står for "vis filnavnet, ikke selve resultatet"./
står for at starte ved roden af din maskine.Du kan bruge ack. Det er ligesom grep for kildekode. Du kan scanne hele dit filsystem med det.
Bare gør det:
ack 'text-to-find-here'
I din rodmappe.
Du kan også bruge regulære udtryk, angive filtype osv.
OPDATERING
Jeg har lige opdaget The Silver Searcher, som er ligesom ack, men 3-5x hurtigere end den og ignorerer endda mønstre fra en .gitignore
-fil.