Mai bine să explic pe exemple.

Pot:

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

Dar cum pot stoca ieșirea în același fișier pentru:

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

Nu pot doar să fac

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

Răspunde

Dacă te înțeleg corect, asta vrei să faci:

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

Găsiți toate fișierele cu extensia .py, grep numai rânduri care conțin something și salvați rândurile în output.txt. Dacă fișierul output.txt există, acesta va fi trunchiat, altfel va fi creat.

Folosind -exec:

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

Eu „încorporez Chris Downs comentează aici: Comanda de mai sus va duce la executarea grep de câte ori find găsește căile de acces care trec testele date (doar singurul test de mai sus). Cu toate acestea, dacă înlocuiți \; cu un +, grep este apelat cu mai multe nume de cale din find (până la o anumită limită).

A se vedea întrebarea Utilizarea punct și virgulă (;) vs plus ( +) cu execut in find pentru mai multe despre subiect.

Comentarii

  • Utilizați + în loc de \;, va îmbunătăți semnificativ timpul de execuție (deoarece va contamina argumente înainte de execuție până la ARG_MAX).
  • Acum înțeleg puterea xargs! Mulțumesc!
  • Folosiți grep -H dacă doriți să includeți numele fișierului fișierului în ieșire.
  • Utilizați opțiunea 1. Și adăugați LC_ALL=C chiar înainte de xargs pentru a obține o mulțime de viteză suplimentară. Și puteți utiliza un semnal -P6 pe xargs pentru a rula în paralel cu (în acest caz) 6 procese (nu ezitați să modificați numărul de la 6 la ceva mai mare sau mai mic, pentru a vedea ce ' este mai rapid pe computer și în căutare). Referință: unix.stackexchange.com/questions/131535/…
  • Utilizarea + în loc de \; va transmite mai multe fișiere către grep și dacă vreun fișier din acel set conține textul ' ceva ', toate acele fișiere vor trece testul. Deci, ' nu a făcut ce vrei.

Răspunde

Dacă doriți să salvați toate liniile potrivite în toate fișierele din output.txt, ultima comandă funcționează, cu excepția faptului că vă lipsește ; la sfârșitul comenzii.

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

Dacă doriți ca fiecare rulare de grep să producă ieșire într-un fișier diferit, rulați un shell pentru a calcula numele fișierului de ieșire și efectuați redirecționarea.

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

Comentarii

  • ultimul foarte frumos: D
  • Pentru a extinde răspunsul @gilles pentru a-l face puțin mai informativ, mai ales dacă lista de fișiere ' re dealing este mare, puteți raporta numele fișierului (calea relativă) a fiecărui fișier împreună cu rezultatele grep ' ed folosind acest lucru: find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt Și dacă ' doriți să vedeți numerele de linie ale liniilor grep ' pe care le puteți folosi, desigur, grep -n "something"

Răspuns

Pentru înregistrare, grep are --include și --exclude argumente pe care le puteți utiliza pentru a filtra fișierele pe care le caută:

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

Comentarii

  • Cel puțin GNU grep nu.

Răspunde

Utilizați tee:

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

Avertismentul este dacă aveți fișiere cu caractere speciale (inclusiv spații) cu care xargs și grep nu au funcționat bine (a file.txt va fi interpretat ca două fișiere, a și file.txt). Alternativa la aceasta este să folosiți fie -x, fie -print0, dar oricare dintre acestea vă va polua output.txt. -x va utiliza \ pentru a scăpa de anumite caractere speciale și aceasta va fi în output.txt.-print0 va utiliza un octet nul ca separator de câmp (care necesită și xargs -0) și output.txt va arăta ca o linie lungă de text contiguă.

Depindeți de modul în care vă ocupați (sau nu faceți acest lucru).

Răspundeți

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *