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
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"`"
+
în loc de\;
, va îmbunătăți semnificativ timpul de execuție (deoarece va contamina argumente înainte de execuție până laARG_MAX
).grep -H
dacă doriți să includeți numele fișierului fișierului în ieșire.LC_ALL=C
chiar înainte dexargs
pentru a obține o mulțime de viteză suplimentară. Și puteți utiliza un semnal-P6
pexargs
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/…+
î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.