Cum pot găsi toate fișierele care conțin un anumit text pe Linux?

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.

Comentarii la întrebare (7)
Soluția

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.
  • "- l " (litere mici L) pot fi adăugate pentru a da doar nume de fișier de potrivire fișiere.

Împreună cu acestea, --exclude, --includ, --exclude-dir flag-urile ar putea fi utilizate pentru căutare eficient:

  • Acest lucru va căuta numai prin acele fișiere care au .c sau .h extensii:

grep-includ=*.{c,h} -rnw '/path/to/undeva/' -e "model"

  • Acest lucru va exclude caută toate fișierele care se termină cu .o extensie:

grep --exclude=*.o-rnw '/path/to/undeva/' -e "model"

  • Pentru directoare it's posibil să se excludă un anumit director(e) prin --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.

Comentarii (36)

Puteți utiliza grep -ilR:

grep -Ril "text-to-find-here" /
  • "i" vine de ignore caz (opțional în cazul tău).
  • "R" vine de recursive.
  • "l" reprezintă "arată numele de fișier, nu rezultatul în sine".
  • / reprezintă pornind de la rădăcina de masina ta.
Comentarii (29)

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.

Comentarii (3)

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

Comentarii (3)

Puteți folosi acest lucru:

grep -inr "Text" folder/to/be/searched/
Comentarii (2)

Lista de nume de fișiere care conțin un anumit text

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" {} \; 

Exemplu

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$ 

Elimina caz sensibilitate

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ă.

Comentarii (4)

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 .
  • `--color=auto - Marca de potrivire text.
  • -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.
Comentarii (2)

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
  • "- l " - numai ieșire nume de fișier în cazul în care meciul a fost găsit
  • -h - numai de ieșire de linie care s-a potrivit (nu filename)
Comentarii (2)
grep -insr "pattern" *
  • "eu": Ignora caz distincții atât în MODELUL și fișierele de intrare.
  • "n": Prefix fiecare linie de ieșire cu 1 bazat pe numărul liniei în cadrul fișierului de intrare.
  • "s": a Suprima mesajele de eroare despre inexistent sau imposibil de citit fișiere.
  • "r": Citește toate fișierele în fiecare director, recursiv.
Comentarii (6)

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 degrep` ș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:

Mai rapid și mai ușor alternative

RipGrep - cel mai rapid instrument de căutare în apropiere:

rg 'text-to-find-here' / -l

De Argint Searcher:

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...

Comentarii (7)

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!

Comentarii (0)

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!

Comentarii (10)

Încercați:

find . -name "*.txt" | xargs grep -i "text_pattern"
Comentarii (1)

grep poate fi folosit chiar dacă ne-am're nu caută un șir de caractere.

Pur și simplu de funcționare,

grep -RIl "" .

va imprima calea pentru toate fișierele de text, și anume cele care conțin numai caractere imprimabile.

Comentarii (1)

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
Comentarii (2)
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
Comentarii (0)

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):

Ripgrep – O nouă linie de comandă instrument de căutare

Comentarii (0)

Î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' {} \;
Comentarii (3)

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:

  1. . în "găsi" specifică din directorul curent.
  2. nume "*.*" : pentru toate fișierele \ (numele "*.pas" -o-numele "*.dfm" ) : Numai *.pas "SAU"*.dfm dosar, SAU specificat cu-o `
  3. de tip f precizează că sunteți în căutarea pentru fișiere
  4. -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.
Comentarii (1)

Un Simplu "găsi" poate lucra la îndemână. alias în folderul~/.bashrc` fișier:

alias ffind find / -type f | xargs grep

Începe un nou terminal și problema:

ffind 'text-to-find-here'
Comentarii (0)