it-swarm-eu.dev

Jak mohu grep výsledky FIND pomocí -EXEC a stále výstup do souboru?

Lepší je vysvětlit na příkladech.

Můžu:

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

Jak ale mohu uložit výstup do stejného souboru pro:

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

Nemůžu jen udělat

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

Pokud vám správně rozumím, je to, co chcete udělat:

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

Find všechny soubory s příponou py, grep pouze řádky, které obsahují something a ukládají řádky do output.txt. Pokud soubor obsahuje cokoli, bude nahrazen.

Upravit: Pomocí -exec:

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

Začleňuji zde komentář Chris Downs. Výše uvedený příkaz bude mít za následek, že grep bude provedeno tolikrát, kolikrát find najde výskyt. Pokud však nahradíte znak ; s +, grep se volá s výstupem zřetězeným 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 předmětu.

119
johnny

Pokud chcete uložit všechny odpovídající řádky do všech souborů 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 Shell pro výpočet názvu výstupního souboru a provedení přesměrování.

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

Pro záznam, grep--include a --exclude argumenty, které můžete použít k filtrování vyhledávaných souborů:

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

Použijte tee:

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

Výzva je, pokud máte nějaké soubory se speciálními znaky (včetně mezer), s nimiž xargs a grep nebudou dobře fungovat (a file.txt bude interpretováno jako dva soubory, a a file.txt). Alternativou k tomu je použít buď -x nebo -print0, ale jeden z nich znečišťuje váš output.txt. The -x použije \ k úniku z určitých zvláštních znaků a to bude v output.txt. The -print0 použije nulový bajt jako oddělovač pole (což také vyžaduje xargs -0) a output.txt bude vypadat jako jeden dlouhý souvislý řádek textu.

Jak se s tím vypořádáte (nebo ne), je jen na vás.

2
bahamat
grep -n CThread '`find . -name "*.cpp"`'
1
turningeagle