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

  • Použijte + místo \; podstatně zlepší dobu provádění (protože bude obsahovat argumenty před provedením do ARG_MAX).
  • Nyní chápu sílu xargs! Děkujeme!
  • Použijte grep -H, pokud chcete do výstupu zahrnout název souboru.
  • Použijte možnost 1. A přidejte LC_ALL=C těsně před xargs a získat spoustu extra rychlosti. A můžete použít -P6 příznak na xargs 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/…
  • Použití + 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.

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žít grep -n "something"

Odpověď

Pro záznam grep--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"`" 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *