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
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 agrep -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"`"
+
a\;
helyett jelentősen megnöveli a végrehajtási időt (mivel a végrehajtás előtti argumentumokatARG_MAX
-ig terjed).grep -H
parancsot, ha a fájl fájlnevét be akarja adni a kimenetbe.LC_ALL=C
közvetlenül axargs
előtt, hogy sok extra sebességhez jusson. És használhat egy-P6
zászlót axargs
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\;
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.