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
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"`"
+
\;
-kohdan sijaan se parantaa suoritusaikaa merkittävästi (koska se saastuttaa argumentteja ennen suoritusta, kunnesARG_MAX
).grep -H
, jos haluat sisällyttää tiedoston tiedostonimen tulosteeseen.LC_ALL=C
juuri ennenxargs
, 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.