Lepší vysvětlení na příkladech.
Mohu:
find . -name "*.py" -type f > output.txt
Ale jak mohu uložit výstup do stejného souboru pro:
find . -name "*.py" -type f -exec grep "something" {} \
Nemohu to udělat
find . -name "*.py" -type f -exec grep "something" {} \ > output.txt
Odpovědět
Pokud vám správně rozumím, chcete udělat:
find . -name "*.py" -print0 | xargs -0 grep "something" > output.txt
Najít všechny soubory s příponou .py
, grep
pouze řádky, které obsahují something
a řádky uložte do output.txt
. Pokud soubor output.txt
existuje, bude zkrácen, jinak bude bude vytvořeno.
Pomocí -exec
:
find . -name "*.py" -exec grep "something" {} \; > output.txt
Začleňuji Chrisa Downse komentář zde: Výsledkem výše uvedeného příkazu bude grep
spuštění tolikrát, kolikrát find
najde názvy cest, které projdou danými testy (pouze jeden test výše). Pokud však \;
nahradíte +
, grep
se volá více cest. od find
(do určitého limitu).
Viz otázka Použití středníku (;) vs plus ( +) s exec in find pro více informací o tomto tématu.
Komentáře
Odpovědět
Pokud chcete uložit všechny odpovídající řádky napříč všemi soubory v output.txt
, váš poslední příkaz funguje, kromě toho, že vám chybí požadovaný ;
na konci příkazu.
find . -name "*.py" -type f -exec grep "something" {} \; > output.txt
Pokud chcete, aby každý běh grep
produkoval výstup do jiného souboru, spusťte prostředí pro výpočet názvu výstupního souboru a proveďte přesměrování.
find . -name "*.py" -type f -exec sh -c "grep "something" <"$0" >"$0.txt"" {} \;
Komentáře
- poslední opravdu pěkný: D
- rozšířit odpověď na @gilles, aby byla trochu informativní, zvláště pokud seznam souborů ' re handling with is large, you can report the file name (relative path) of each file along with the grep ' ed results using this:
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
A pokud ' chcete vidět Čísla řádků grep ' ed řádků můžete samozřejmě použítgrep -n "something"
Odpověď
Pro záznam grep
má --include
a --exclude
argumenty, které můžete použít k filtrování souborů, které prohledává:
grep -r --include="*.py" "something" > output.txt
Komentáře
- Alespoň GNU
grep
ano.
Odpovědět
Použijte tee
:
find . -name "*.py" | tee output.txt | xargs grep "something"
Upozornění, pokud máte nějaké soubory se speciálními znaky (včetně mezer), se kterými xargs
a grep
nebudou dobře fungovat (a file.txt
budou interpretovány jako dva soubory, a
a file.txt
). Alternativou k tomu je použít buď -x
nebo -print0
, ale některý z nich bude znečišťovat vaše output.txt
. -x
pomocí \
unikne některým zvláštním znakům a bude to v output.txt
.-print0
použije jako oddělovač pole nulový bajt (což také vyžaduje xargs -0
) a output.txt
bude vypadat jako jeden dlouhý souvislý řádek textu.
Jak s tím naložíte (nebo ne), je jen na vás.
Odpovědět
grep -n CThread "`find . -name "*.cpp"`"
+
místo\;
podstatně zlepší dobu provádění (protože bude obsahovat argumenty před provedením doARG_MAX
).grep -H
, pokud chcete do výstupu zahrnout název souboru.LC_ALL=C
těsně předxargs
a získat spoustu extra rychlosti. A můžete použít-P6
příznak naxargs
ke spuštění paralelně s (v tomto případě) 6 procesy (klidně změňte počet od 6 do něčeho vyššího nebo nižšího, abyste zjistili, co je ' rychlejší na vašem počítači a na vašem hledání). Odkaz: unix.stackexchange.com/questions/131535/…+
místo\;
předá více souborů grep, a pokud nějaký soubor v této sadě obsahuje text ' něco ', všechny tyto soubory projdou testem. Takže ' nebude dělat, co chcete.