Haluaisin luetella rekursiivisesti ja ainutlaatuisesti tiedostot, jotka sisältävät annetun sanan.
Esimerkki : Tarkistetaan sana ”tarkista”, olen tavallisesti grep
$ grep check * -R
Mutta koska tätä sanaa esiintyy monta kertaa, saan paljon tulosteita. Joten minun täytyy vain luetella tiedostonimet, jotka sisältävät annetun hakusanan. Luulen, että jokin temppu find
ja xargs
kanssa riittää tässä, mutta ei varma.
Onko sinulla ideoita?
Vastaa
Käytä -l
tai --files-with-matches
-vaihtoehto, joka on dokumentoitu seuraavasti:
Estä normaali lähtö; sen sijaan tulostaa jokaisen syötetiedoston nimi, josta lähtö olisi normaalisti tulostettu. Skannaus loppuu ensimmäisestä ottelusta. (POSIX määrittelee
-l
.)
Joten esimerkkinä voit käyttää seuraavaa:
$ grep check * -lR
Kommentit
Vastaa
find . -type f -exec grep -l check {} +
Et todennäköisesti halua käyttää vaihtoehtoa -R
, jota GNU: n moderneissa versioissa grep
seuraa symbolisia linkkejä laskiessaan hakemistoja. Käytä sen sijaan vaihtoehtoa -r
, joka version 2.12 (huhtikuu 2012) jälkeen ei enää seuraa symlinkkejä.
Jos grep ei ole GNU-tyyppinen tai on vanhempi kuin versio 2.12 tai jos tarvitset koodisi siirrettäväksi ei-verenvuotoisiin GNU-järjestelmiin, käytä find
-komento yllä.
Muussa tapauksessa voit tehdä seuraavaa:
grep -rl check .
Älä käytä *
(koska tämä jättää piilotetut tiedostot pois nykyisestä hakemistosta (ja vain nykyisestä hakemistosta) ja aiheuttaisi ongelmia tiedostoille, joiden nimi alkaa -
), vältä välittämistä vaihtoehdot argumenttien jälkeen, koska se ei ole takuu Suunniteltu toimimaan ympäristöstä riippuen, eikä sitä voi siirtää.
Vastaa
Kokeile tätä:
find . -type f | xargs grep -c check $1 | grep -v ":0"
Mitä tulee grep
-lippuihin …
-c
tulee palauta tiedostonimi, jota seuraa: ja luku, joka kertoo, kuinka monta kertaa hakumerkkijono esiintyy annetussa tiedostossa.
-v
ottaa tuloksen ensimmäisestä grep
etsi, suodata tiedostot ilman tuloksia ja tulosta vain tiedostot, joilla ei ole nolla tulosta.
Kommentit
- Tämä saa väärän negatiivisen tuloksen, jos sinulla on tiedostoja (tai ohjaimia), joiden nimet sisältävät
:0
. ' on parempi tehdägrep -v ':0$'
. Jopa tämä tukahduttaa polkuja, jotka sisältävät uusia rivejä.
Vastaa
grep -lR "text-to-find" <where-to-find>
toimii myös hyvin.
esim. grep -lR "NAVIGATE" .
mistä löydämme sanan NAVIGATE
hakemistosta .
nykyisessä hakemistossa.
Vastaa
grep -rin ”whatToFind” locationToFInd
esim. $ grep -rin ”vihaan”.
etsii rekursiivisesti tiedostojen nimiä ja vastaavia rivejä, joissa on ”vihaan”, ”.” viittaa nykyiseen hakemistoon.
Vastaa
find . -type f | grep "keyword" *
etsi nykyisessä hakemistossa. Jos haluat hakea juuresta, määritä /
.
Vastaa
grep -rli trim \` find . -name *.q \`
Anna luettelo .q
-tiedostoista, jotka sisältävät avainsanan iv id = ”b9226c43b6”
grep -rl "text to find" "/usr/share"
ja se toimi hyvin!