Parempi selittäminen esimerkeistä.

Voin:

find . -name "*.py" -type f > output.txt 

Mutta kuinka voin tallentaa lähdön samaan tiedostoon:

find . -name "*.py" -type f -exec grep "something" {} \ 

En voi vain tehdä

find . -name "*.py" -type f -exec grep "something" {} \ > output.txt 

Vastaa

Jos ymmärrän sinut oikein, sinun on tehtävä tämä:

find . -name "*.py" -print0 | xargs -0 grep "something" > output.txt 

Etsi kaikki tiedostot, joiden laajennus on .py, grep vain rivejä, jotka sisältävät something ja tallenna rivit tiedostoon output.txt. Jos output.txt -tiedosto on olemassa, se katkaistaan, muuten se luodaan.

Käyttämällä -exec:

find . -name "*.py" -exec grep "something" {} \; > output.txt 

I ”m mukaan lukien Chris Downs kommentoi täällä: Yllä oleva komento johtaa siihen, että grep suoritetaan niin monta kertaa kuin find löytää polut, jotka läpäisevät annetut testit (vain yksittäinen -testi yllä). Jos kuitenkin korvataan \; +, grep kutsutaan useilla polkuilla kohteesta find (tiettyyn rajaan saakka).

Katso kysymys Puolipisteen (;) ja plus ( +) ja exec in find -sovelluksessa saadaksesi lisätietoja aiheesta.

Kommentit

  • Käytä + \; -kohdan sijaan se parantaa suoritusaikaa merkittävästi (koska se saastuttaa argumentteja ennen suoritusta, kunnes ARG_MAX).
  • Nyt ymmärrän xargien voiman! Kiitos!
  • Käytä grep -H, jos haluat sisällyttää tiedoston tiedostonimen tulosteeseen.
  • Käytä vaihtoehtoa 1. Ja lisää LC_ALL=C juuri ennen xargs, jotta saat paljon ylimääräistä nopeutta. Ja voit käyttää -P6 -merkkiä xargs -laitteessa ajaaksesi rinnakkain (tässä tapauksessa) 6 prosessia (voit muuttaa numeroa 6: sta korkeammalle tai matalammalle, jotta näet ' nopeammin koneellasi ja haullasi). Viite: unix.stackexchange.com/questions/131535/…
  • + \; -kohdan sijaan siirtää useita tiedostoja grepiin, ja jos jokin tämän ryhmän tiedosto sisältää tekstin ' jotain ', kaikki nuo tiedostot läpäisevät testin. Joten se ei voittanut ' t tekemään mitä haluat.

Vastaa

Jos haluat tallentaa kaikki vastaavat rivit kaikkiin tiedostoihin output.txt, viimeinen komento toimii, paitsi että puuttuu pakollinen ; komennon lopussa.

find . -name "*.py" -type f -exec grep "something" {} \; > output.txt 

Jos haluat, että jokainen grep -ajo tuotetaan tulosta toiseen tiedostoon, suorita komentotulkki laskeaksesi lähtötiedoston nimi ja suorita uudelleenohjaus.

find . -name "*.py" -type f -exec sh -c "grep "something" <"$0" >"$0.txt"" {} \; 

Kommentit

  • viimeinen todella mukava: D
  • Laajenna @gilles-vastausta, jotta se olisi hieman informatiivisempi, varsinkin jos luettelo tiedostoista ' re-käsittely on suuri, voit ilmoittaa jokaisen tiedoston tiedostonimen (suhteellisen polun) yhdessä grep ' ed -tulosten kanssa seuraavasti: find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt Ja jos ' haluaisit nähdä e grep ' ed-rivien rivinumerot, voit tietysti käyttää grep -n "something"

vastaus

Tietueessa grep on --include ja --exclude argumentit, joiden avulla voit suodattaa hakemansa tiedostot:

grep -r --include="*.py" "something" > output.txt 

Kommentit

  • Ainakin GNU grep tekee.

Vastaa

Käytä tee:

find . -name "*.py" | tee output.txt | xargs grep "something" 

Varoitus on, jos sinulla on tiedostoja erikoismerkeillä (välilyönnit mukaan lukien), jotka xargs ja grep eivät toimi hyvin (a file.txt tulkitaan kahtena tiedostona, a ja file.txt). Vaihtoehto on käyttää joko -x tai -print0, mutta jompikumpi näistä saastuttaa output.txt. -x käyttää \ paeta tiettyjä erikoismerkkejä, ja tämä on output.txt.-print0 käyttää nollatavua kentän erottimena (joka vaatii myös xargs -0) ja output.txt näyttää yhdeltä pitkältä vierekkäiseltä tekstiriviltä.

Sinä päätät, miten käsittelet (tai et ”t”).

Vastaa

grep -n CThread "`find . -name "*.cpp"`" 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *