Jobb megmagyarázni a példákat.

Tudom:

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

De hogyan tárolhatom a kimenetet ugyanabba a fájlba a következőhöz:

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

Nem tudom csak megtenni

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

Válasz

Ha jól értem, ezt kell tennie:

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

Az összes olyan fájl megtalálása, amelynek kiterjesztése .py, grep csak azok a sorok találhatók, amelyek something és mentse el a sorokat a output.txt mappába. Ha a output.txt fájl létezik, akkor csonkolásra kerül, különben ez létre fog jönni.

A -exec használata:

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

I “m, beleértve Chris Downs-t megjegyzés itt: A fenti parancs azt eredményezi, hogy grep annyiszor kerül végrehajtásra, ahányszor find megtalálja az adott teszteken áteső útvonalneveket (csak az egyetlen teszt fent). Ha azonban a \; szöveget lecseréli egy + elemre, akkor a grep -t több útvonalnévvel hívja meg find -től (egy bizonyos határig).

Lásd a kérdést pontosvessző (;) és plusz ( +) az exec-lel a keresésben további információkért a témáról.

Megjegyzések

  • Használja a + a \; helyett jelentősen megnöveli a végrehajtási időt (mivel a végrehajtás előtti argumentumokat ARG_MAX -ig terjed).
  • Most már értem az xargs erejét! Köszönöm!
  • Használja az grep -H parancsot, ha a fájl fájlnevét be akarja adni a kimenetbe.
  • Használja az 1. opciót, és adja hozzá a LC_ALL=C közvetlenül a xargs előtt, hogy sok extra sebességhez jusson. És használhat egy -P6 zászlót a xargs oldalon, hogy párhuzamosan fusson (ebben az esetben) 6 folyamattal (bátran változtassa meg a számot 6-tól valami magasabb vagy alacsonyabbig, hogy lássa, mi ' gyorsabb a gépén és a keresésén). Hivatkozás: unix.stackexchange.com/questions/131535/…
  • A + a \; helyett több fájlt továbbít a grep számára, és ha a készlet bármelyik fájlja tartalmazza a következő szöveget: ' valami ', az összes fájl sikeresen átmegy. Tehát nem fog ' t csinálni, amit akar.

Válasz

Ha az összes illeszkedő sort el akarja menteni az összes fájlba a output.txt fájlban, akkor az utolsó parancs működik, azzal a különbséggel, hogy hiányzik a szükséges ; a parancs végén.

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

Ha azt szeretné, hogy a grep minden egyes futtatása előálljon kimenjen egy másik fájlba, futtasson egy shellt a kimeneti fájl nevének kiszámításához és az átirányítás végrehajtásához.

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

Megjegyzések

  • az utolsó nagyon szép: D
  • A @gilles válasz kibővítésével, hogy egy kicsit informatívabb legyen, különösen, ha a fájlok listája ' re foglalkozás nagy, jelentheti az egyes fájlok fájlnevét (relatív elérési útját) a grep ' ed eredményeivel együtt, ezzel: find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt És ha ' szeretnél látni e a grep ' ed sorok sorszámait természetesen használhatja a grep -n "something"

Válasz

A bejegyzéshez a grep --include és --exclude argumentumok, amelyekkel szűrheti a keresett fájlokat:

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

Megjegyzések

  • Legalább a GNU grep.

Válasz

Használja a tee parancsot:

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

A figyelmeztetés az, ha van fájlja speciális karakterekkel (beleértve a szóközöket is), amelyekkel xargs és grep nem fog jól működni (a file.txt két fájlként fog értelmezni: a és file.txt). Ennek alternatívája a -x vagy a -print0 használata, de ezek bármelyike szennyezi a output.txt. A -x a \ parancsot használja bizonyos speciális karakterek elkerülésére, és ez a output.txt fájlban lesz.A -print0 egy null bájtot használ mezőelválasztóként (amihez szintén szükséges: xargs -0) és output.txt egy hosszú összefüggő szövegsornak fog kinézni.

Ez rajtad múlik.

Válasz

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük