Kako v Linuxu poiščem vse datoteke, ki vsebujejo določeno besedilo?

Poskušam najti način za pregledovanje celotnega sistema Linux za vse datoteke, ki vsebujejo določen niz besedila. Da pojasnim, iščem besedilo v datoteki in ne v imenu datoteke.

Ko sem iskal, kako to narediti, sem dvakrat naletel na to rešitev:

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

Vendar ne deluje. Zdi se, da prikaže vsako posamezno datoteko v sistemu.

Ali je to blizu pravilnemu načinu? Če ne, kako naj to storim? Ta zmožnost iskanja besedilnih nizov v datotekah bi bila izredno koristna za nekatere programske projekte, ki jih izvajam.

Rešitev

Naredite naslednje:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r ali -R je rekurziven,
  • -n je številka vrstice in
  • -w pomeni ujemanje celotne besede.
  • -l (mala črka L) se lahko doda, če želite navesti samo ime datoteke, ki se ujema.

Poleg teh lahko za učinkovito iskanje uporabimo tudi oznake --exclude, --include, --exclude-dir:

  • Tako se bodo iskale samo tiste datoteke, ki imajo končnico .c ali .h:

    V primeru, da je v datoteko vnesena datoteka, ki vsebuje datoteke, lahko uporabite naslednje možnosti: grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
  • To bo izključilo iskanje vseh datotek, ki se končajo s končnico .o:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
  • Pri imenikih je mogoče izključiti določen(e) imenik(e) s parametrom --exclude-dir. To bo na primer izključilo imenike dir1/, dir2/ in vse, ki ustrezajo *.dst/:

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

To mi zelo dobro deluje, da bi dosegel skoraj enak namen, kot ga imaš ti.

Za več možnosti preverite man grep.

Komentarji (36)

Uporabite lahko grep -ilR:

grep -Ril "text-to-find-here" /
  • i pomeni ignoriraj primer (v vašem primeru ni obvezno).
  • R pomeni rekurzivno.
  • l pomeni "prikaži ime datoteke in ne samega rezultata".
  • / pomeni začetek v korenu računalnika.
Komentarji (29)

Uporabite lahko ack. To je kot grep za izvorno kodo. Z njim lahko pregledate celoten datotečni sistem.

Naredite naslednje:

ack 'text-to-find-here'

V korenskem imeniku.

Uporabite lahko tudi regularne izraze, določite vrsto datoteke itd.


DOPOLNITEV

Pravkar sem odkril The Silver Searcher, ki je podoben programu ack, vendar je 3-5x hitrejši od njega in celo ignorira vzorce iz datoteke .gitignore.

Komentarji (3)