Yritän löytää keinon skannata koko Linux-järjestelmäni kaikkien tietyn merkkijonon sisältävien tiedostojen varalta. Selventääkseni, etsin tekstiä tiedoston sisällä, en tiedoston nimessä.
Kun etsin, miten tämä tehdään, törmäsin tähän ratkaisuun kahdesti:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Se ei kuitenkaan toimi. Se näyttää näyttävän jokaisen järjestelmän tiedoston.
Onko tämä lähellä oikeaa tapaa tehdä se? Jos ei, miten minun pitäisi toimia? Tämä kyky löytää merkkijonoja tiedostoista olisi erittäin hyödyllinen joissakin ohjelmointiprojekteissa, joita teen.
Toimi seuraavasti:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
tai -R
on rekursiivinen,-n
on rivin numero, ja-w
tarkoittaa koko sanaa.-l
(pieni L) voidaan lisätä, jos halutaan vain antaa vastaavien tiedostojen tiedostonimet.Näiden lisäksi voidaan käyttää --exclude
, --include
ja --exclude-dir
-lippuja tehokkaaseen hakuun:
Tämä etsii vain tiedostot, joilla on .c- tai .h-päätteet:
-rnw '/polku/to/jonnekin/' -e "pattern"
Tämä sulkee pois haun kaikista .o-päätteisistä tiedostoista:
grep --exclude=*.o -rnw '/polku/to/somewhere/' -e "pattern"
Hakemistojen osalta on mahdollista sulkea pois tietty(t) hakemisto(t) parametrin --exclude-dir
avulla. Esimerkiksi tämä sulkee pois hakemistot dir1/, dir2/ ja kaikki ne, jotka vastaavat *.dst/:
grep --exclude-dir={hakemisto1,hakemisto2,*.dst} -rnw '/polku/to/jonnekin/' -e "pattern"
Tämä toimii minulla erittäin hyvin, saavuttaa lähes saman tarkoituksen kuin sinun.
Lisää vaihtoehtoja saat man grep
-ohjelmasta.
Voit käyttää grep -ilR
:
grep -Ril "text-to-find-here" /
i
tarkoittaa ignore case (valinnainen sinun tapauksessasi). R
tarkoittaa rekursiivista. l
tarkoittaa "näytä tiedoston nimi, älä itse tulosta"./
tarkoittaa, että haku alkaa koneesi juuresta.Voit käyttää ack. Se on kuin grep lähdekoodille. Voit skannata sillä koko tiedostojärjestelmän.
Tee näin:
ack 'text-to-find-here'
Juurihakemistossasi.
Voit myös käyttää säännöllisiä lausekkeita, määrittää tiedostotyypin jne.
UPDATE
Löysin juuri The Silver Searcher, joka on kuin ack, mutta 3-5 kertaa nopeampi kuin se, ja se jopa jättää huomiotta .gitignore
-tiedoston mallit.