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.
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
.
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.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
.