Mai mult
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.
4881
45
Faceți următoarele:
-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
:/
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:
Î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:
"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):
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
Puteți folosi acest lucru:
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{} \
.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).
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ă.
grep
(GNU sau BSD)Puteți utiliza
grep
instrument pentru a căuta recursiv directorul curent, cum ar fi:Notă:
-r
- Recursiv căutare subdirectoare.Puteți folosi, de asemenea, expandarea sintaxă de căutare în fișierele specifice cum ar fi:
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:
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: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" cuxargs
: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
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)Dacă utilizați find ca in exemplul tau, mai bine se adaugă
-s
(--no-mesaje
) agrep
, și2>/dev/null la sfârșitul comenzii, pentru a evita o mulțime de *Permission denied* mesajele emise de
grep` și "găsi":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:
De Argint Searcher:
ack:
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
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
Și-l va face sarcina pentru tine!
Utilizarea
pwd
pentru a căuta de la orice director care vă aflați, recursing josUpdate Î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!
Încercați:
grep
poate fi folosit chiar dacă ne-am're nu caută un șir de caractere.Pur și simplu de funcționare,
va imprima calea pentru toate fișierele de text, și anume cele care conțin numai caractere imprimabile.
Aici sunt mai multe listă de comenzi care pot fi utilizate pentru a căuta fișierul.
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.
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
Încercați:
care va căuta toate sistemele de fișiere, deoarece
/
este folderul rădăcină.Pentru home folder utilizare:
Pentru dosarul curent de utilizare:
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ă:Ș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: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" lagrep
încorporate înxargs
, 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.Un Simplu "găsi" poate lucra la îndemână. alias în folderul~/.bashrc` fișier:
Începe un nou terminal și problema: