Am'm încercarea de a găsi o modalitate de a scana întregul meu sistem Linux pentru toate fișierele care conțin un anumit șir de text. Doar pentru a clarifica, am'm în căutarea de text în fișier, nu în numele de fișier.
Când m-am uitat la modul de a face acest lucru, am dat peste această soluție de două ori:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Cu toate acestea, nu't de lucru. Se pare că pentru a afișa fiecare fișier în sistem.
Este foarte aproape să-modul corect de a face asta? Dacă nu, cum ar trebui să am? Acest lucru capacitatea de a găsi șiruri de text în fișiere ar fi extrem de utile pentru unele proiecte de programare I'm a face.
Faceți următoarele:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
sau -R
este recursiv, -n
este numărul de linie, și -w
standuri pentru a se potrivi întregul cuvânt. Împreună cu acestea, --exclude
, --includ
, --exclude-dir
flag-urile ar putea fi utilizate pentru căutare eficient:
grep-includ=*.{c,h} -rnw '/path/to/undeva/' -e "model"
grep --exclude=*.o-rnw '/path/to/undeva/' -e "model"
--exclude-dir
parametru. De exemplu, acest lucru va exclude dirs dir1/, dir2/ și toate dintre ele de potrivire *.dst/:grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/undeva/' -e "model"
Acest lucru funcționează foarte bine pentru mine, pentru a obține aproape același scop ca al tău.
Pentru mai multe opțiuni de check man grep
.
Puteți utiliza grep -ilR
:
grep -Ril "text-to-find-here" /
/
reprezintă pornind de la rădăcina de masina ta.Puteți utiliza ack. Este ca grep pentru codul sursă. Puteți scana întregul sistem de fișiere cu ea.
Doar să faceți:
ack 'text-to-find-here'
În directorul rădăcină.
Puteți folosi, de asemenea, expresii regulate, specificați tipul fisierului, etc.
UPDATE
Tocmai am descoperit De Argint Searcher, care este ca ack, dar de 3-5x mai repede decât el și chiar ignoră modele dintr-o .gitignore
de fișier.
Puteți folosi:
grep -r "string to be searched" /path/to/dir
"R" vine de recursive și așa va căuta în calea specificată și, de asemenea, sub-directoare. Acest lucru vă va spune numele de fișier, precum și de imprimare pe linie în fișierul unde apare string.
Sau o comandă similară cu cea pe care o încearcă (de exemplu: ) pentru căutarea în toate javascript fișiere (*.js):
find . -name '*.js' -exec grep -i 'string to search for' {} \; -print
Aceasta va imprima linii în dosarele în care textul apare, dar nu se imprimă numele de fișier.
În plus față de această comandă, se poate scrie si ca: grep -rn "Șir de căutare" /path/to/directorul/sau/fișier -r: căutare recursivă n: numărul de linie va fi afișat pentru meciuri
Mai întâi de toate, cred că ai folosit -H "în loc de" - l
. De asemenea, puteți încerca adăugarea de text în interiorul citate, urmat de {} \
.
find / -type f -exec grep -l "text-to-find-here" {} \;
Las's spun sunteți în căutarea pentru fișiere care conțin un anumit text "Apache License" în interiorul directorul. Se va afișa rezultate oarecum similare de mai jos (de ieșire vor fi diferite în funcție de director de conținut).
bash-4.1$ find . -type f -exec grep -l "Apache License" {} \;
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$
Chiar dacă nu sunt utilizați despre cazul ca "text" vs "TEXT", puteți utiliza -i
a comuta la ignore caz. Puteți citi mai multe detalii aici.
Sper că acest lucru vă ajută.
grep
(GNU sau BSD)Puteți utiliza grep
instrument pentru a căuta recursiv directorul curent, cum ar fi:
grep -r "class foo" .
Notă: -r
- Recursiv căutare subdirectoare.
Puteți folosi, de asemenea, expandarea sintaxă de căutare în fișierele specifice cum ar fi:
grep "class foo" **/*.c
Notă: Prin utilizarea expandarea opțiune (**
), acesta scanează toate fișierele recursiv cu extensia specifică sau model. Pentru a activa această sintaxă, run: shopt -s globstar
. Puteți folosi, de asemenea,**/*. *
pentru toate fișierele (cu excepția ascunse și fără extensie) sau orice alt model.
Daca'am eroarea că argumentul tău e prea mult, ia în considerare restrângerea dvs. de căutare, sau de a folosi "găsi" sintaxă în loc, cum ar fi:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
Alternativ, utilizați ripgrep
.
ripgrep
Daca're de lucru pe proiecte mai mari sau fișiere mari, ar trebui să utilizați ripgrep
în loc, cum ar fi:
rg "class foo" .
Verificare docs, pașii de instalare sau de cod sursă pe GitHub pagina proiectului.
L's mult mai rapid decât orice alt instrument, cum ar fi GNU/BSD grep
, ucg
, ag
, cerne
, d
, pt
sau similare, deoarece este construit pe partea de sus a Rust's regex motor, care folosește automatelor finite, SIMD și agresiv literal optimizări pentru a face căutarea foarte repede.
Acesta susține ignora modelele specificate in .gitignore
fișiere, astfel încât o singură cale de fișier poate fi compensată împotriva mai multor glob modele simultan.
Puteți utiliza parametrii comuni cum ar fi:
-i
- Insensibil căutarea.-I
- Ignora fișierele binare.-w
- de Căutare pentru cuvinte întregi (în opusul parțială de potrivire cuvânt).-n
- Show linia de meci.-C
/--context (de exemplu
-C5`) - Crește context, deci, veți vedea din jur cod .-H
- Afișează numele fișierului în cazul în care textul este găsit.-c
- Afișează numărul de potrivire linii. Poate fi combinat cu -H
.Dacă grep
nu't suport recursiv de căutare, puteți combina "găsi" cu xargs
:
find / -type f | xargs grep 'text-to-find-here'
Am găsi acest lucru mai ușor de reținut decât formatul pentru a găsi -exec`.
Acest lucru va ieșire nume de fișier și conținutul potrivit linie, de exemplu
/home/rob/file:text-to-find-here
Opțional steaguri poate doriți să adăugați la grep
:
-i
- caz insensibil căutare-h
- numai de ieșire de linie care s-a potrivit (nu filename)grep -insr "pattern" *
Cum pot găsi toate fișierele care conțin un anumit text pe Linux? (...)
am dat peste această soluție de două ori:
find / -type f -exec grep -H 'text-to-găsiți-aici' {} \;
Dacă utilizați find ca in exemplul tau, mai bine se adaugă -s
(--no-mesaje
) a grep
, și 2>/dev/null la sfârșitul comenzii, pentru a evita o mulțime de *Permission denied* mesajele emise de
grep` și "găsi":
find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null
find este instrumentul standard pentru căutarea fișierelor - combinate cu grep atunci când caută pentru un anumit text - pe Unix-cum ar fi platforme. Pe find comanda este de multe ori combinat cu xargs, apropo.
Mai rapid și mai ușor instrumente există pentru același scop - de a se vedea mai jos. Mai bine încercați-le, cu condiția ca acestea're disponibile pe platforma, desigur:
RipGrep - cel mai rapid instrument de căutare în apropiere:
rg 'text-to-find-here' / -l
ag 'text-to-find-here' / -l
ack:
ack 'text-to-find-here' / -l
Notă: puteți adăuga 2>/dev/null
la aceste comenzi, precum și, pentru a ascunde multe mesaje de eroare.
Avertisment: doar dacă puteți't-l evite, don't de căutare de '/' (directorul rădăcină) pentru a evita o lungă și ineficientă de căutare! Astfel, în exemplele de mai sus, ai'd mai bine să o înlocuiască '/' printr-un sub-director nume, de exemplu, "/home" în funcție de locul unde doriți de fapt să-căutare...
Nu's un nou utilitar numit La Silversearcher
sudo apt install silversearcher-ag
Acesta lucrează în strânsă colaborare cu Git și alte VCS. Deci, ai castigat't obține nimic în a .git sau un alt director.
Puteți folosi pur și simplu
ag "Search query"
Și-l va face sarcina pentru tine!
Utilizarea pwd
pentru a căuta de la orice director care vă aflați, recursing jos
grep -rnw `pwd` -e "pattern"
Update
În funcție de versiunea de grep pe care îl utilizați, puteți omite pwd
. Pe versiunile mai noi .
pare a fi cazul implicit pentru grep dacă nici un director nu este dat
astfel:
grep -rnw -e "model"
sau
grep -rnw "model"
va face același lucru ca mai sus!
Aici sunt mai multe listă de comenzi care pot fi utilizate pentru a căuta fișierul.
grep "text string to search” directory-path
grep [option] "text string to search” directory-path
grep -r "text string to search” directory-path
grep -r -H "text string to search” directory-path
egrep -R "word-1|word-2” directory-path
egrep -w -R "word-1|word-2” directory-path
find /path -type f -exec grep -l "string" {} \;
Explicație de la comentarii
găsi este o comandă care vă permite să găsiți fișierele și alte obiecte, cum ar fi directoarele și link-uri in subdirectoare de o anumită cale. Dacă tu nu't specifica o masca care filesnames ar trebui să se întâlnească, se enumeră toate obiectele din directorul.
-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename
Argint Searcher este un instrument teribil, dar ripgrep poate fi chiar mai bine.
Acesta funcționează pe Linux, Mac și Windows, și a fost scrisă pe Hacker News un cuplu de luni în urmă (acest lucru are un link de Andrew Galant's Blog care are o GitHub link):
Încercați:
find / -type f -exec grep -H 'text-to-find-here' {} \;
care va căuta toate sistemele de fișiere, deoarece /
este folderul rădăcină.
Pentru home folder utilizare:
find ~/ -type f -exec grep -H 'text-to-find-here' {} \;
Pentru dosarul curent de utilizare:
find ./ -type f -exec grep -H 'text-to-find-here' {} \;
Sper că acest lucru este de ajutor...
Extinderea grep
un pic pentru a da mai multe informații la ieșire, de exemplu, pentru a obține numărul de linie în fișierul text se poate face după cum urmează:
find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
Și dacă aveți o idee ce tip de fișier este, puteți restrânge căutarea prin specificarea tip de fișier extensii pentru a căuta, în acest caz .pas "SAU".dfm
fișiere:
find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"
Scurtă descriere a opțiuni:
.
în "găsi" specifică din directorul curent.nume
"*.*
" : pentru toate fișierele
\ (numele "*.pas
" -o-numele "*.dfm
" ) : Numai *.pas "SAU"*.dfm dosar, SAU specificat cu
-o `de tip f
precizează că sunteți în căutarea pentru fișiere-print0 " și "--nul
pe cealaltă parte a |
(pipe) sunt importante, trecând numele de "găsi" la grep
încorporate în xargs
, care să permită trecerea de nume de fișiere CU spații în numele de fișiere, permițându-grep pentru a trata calea și numele de fișier ca un șir de caractere, și nu rupe-l în sus pe fiecare spațiu.