Kaip rasti visus failus, kuriuose yra konkretus tekstas „Linux“?

Bandau rasti būdą, kaip nuskaityti visą Linux sistemą visoms rinkmenoms, turinčioms tam tikrą teksto eilutę. Norėdami išsiaiškinti, ieško teksto faile, o ne failo pavadinime.

Kai ieškojau, kaip tai padaryti, šį sprendimą aš patyriau du kartus:

 find / -type f -exec grep -H 'text-to-find-here' {} \; 

Tačiau tai neveiks. Atrodo, jis rodo kiekvieną sistemos failą.

Ar tai arti teisingo būdo tai padaryti? Jei ne, kaip aš galiu? Šis gebėjimas rasti teksto eilutes failuose bus labai naudingas kai kuriems programavimo projektams.

4058
06 июня '13 в 11:06 2013-06-06 11:06 Nathanas yra nustatytas birželio 6 d. 13 val. 11:06 2013-06-06 11:06
ответ 41 atsakymas
  • 1
  • 2

Atlikite šiuos veiksmus:

7355
06 июня '13 в 11:21 2013-06-06 11:21 atsakymas pateikiamas rakib_ 06 Birželio 13 d. 11:21 2013-06-06 11:21

Galite naudoti grep -ilR :

 grep -Ril "text-to-find-here" / 
border=0
  • i reiškia ignoravimo atvejį (neprivaloma jūsų atveju).
  • R reiškia rekursinį.
  • l reiškia „rodyti failo pavadinimą, o ne paties rezultatą“.
  • / reiškia pradėti nuo automobilio šaknies.
1188
06 июня '13 в 11:08 2013-06-06 11:08 atsakymas pateikiamas fedorqui birželio 06 d. 13 val. 11:08 2013-06-06 11:08

Galite naudoti ack . Tai panaši į šaltinio kodo grep . Galite peržiūrėti visą failų sistemą.

Tiesiog sekite:

 ack 'text-to-find-here' 

Į šaknų katalogą.

Taip pat galite naudoti įprastas išraiškas , nurodyti failo tipą ir kt.


UPDATE

Aš ką tik rado sidabro ieškiklį , kuris yra panašus į ack, bet 3-5 kartus greičiau, nei netgi ignoruoja .gitignore failo šablonus.

260
06 июня '13 в 11:26 2013-06-06 11:26 atsakymą pateikė „ EarlOfEgo“ birželio 13 d. 13 val. 11:26 2013-06-06 11:26

Galite naudoti:

 grep -r "string to be searched" /path/to/dir 

r reiškia rekursyvumą ir todėl ieškos nustatyto kelio, taip pat jo pakatalogiuose. Tai jums pasakys failo pavadinimą ir taip pat išspausdins eilutę faile, kuriame rodoma eilutė.

Arba komanda, panaši į tą, kurią bandote (pavyzdys :) ieškoti visuose „JavaScript“ failuose (* .js):

 find . -name '*.js' -exec grep -i 'string to search for' {} \; -print 

Tai spausdins eilutes failuose, kuriuose rodomas tekstas, bet ne failo pavadinimas.

Be šios komandos, mes taip pat galime rašyti: grep -rn "String to search" / kelias / į / katalogą / arba / failas -r: rekursinė paieška n: eilutės numeris bus rodomas atitikmenims

145
15 марта '14 в 2:29 2014-03-15 02:29 atsakymas pateikiamas besimokančiajam_19 kovo 15 d. 14:29 2014-03-15 02:29

Galite naudoti:

 grep -inr "Text" folder/to/be/searched/ 
89
31 июля '13 в 16:44 2013-07-31 16:44 atsakymas pateikiamas AR liepos 31 d. 13 val. 4:44 2013-07-31 16:44

Failų pavadinimų, kuriuose yra nurodytas tekstas, sąrašas

Visų pirma, manau, jūs naudojote -H vietoj -l . Taip pat galite pabandyti pridėti tekstą kabutėse ir tada {} \ .

 find / -type f -exec grep -l "text-to-find-here" {} \; 

pavyzdys

Tarkime, jūs ieškote failų, kuriuose yra konkretus tekstas „Apache License“ jūsų kataloge. Tai parodys šiek tiek panašius rezultatus kaip ir žemiau (išvestis skirsis priklausomai nuo jūsų katalogo turinio).

 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$ 

Atveju atvejo jautrumas

Net jei nenaudojate „teksto“ ir „TEKSTO“ atvejo, galite naudoti -i jungiklį ignoruoti atvejį. Daugiau informacijos rasite čia .

Tikiuosi, kad tai padės jums.

58
09 нояб. atsakymas pateikiamas lkamal . 2013-11-09 16:18 '13, 16:18, 2013-11-09 16:18

Jei jūsų grep nepalaiko rekursyvios paieškos, galite suderinti find su xargs :

 find / -type f | xargs grep 'text-to-find-here' 

Man lengviau prisiminti nei find -exec formatą.

Tai parodys, pavyzdžiui, failo pavadinimą ir atitinkamos eilutės turinį.

 /home/rob/file:text-to-find-here 

Papildomos vėliavėlės, kurias galite įtraukti į „ grep :

  • -i - bylos nejautri paieška
  • -l - rodyti tik failo, kuriame buvo rastas atitikmuo, pavadinimą.
  • -h - rodo tik eilutę, kuri atitinka (o ne failo pavadinimą)
48
20 июня '14 в 11:49 2014-06-20 11:49 atsakymą pateikė RobEarl birželio 14 d. 14 val. 11:49 2014-06-20 11:49

grep ( GNU arba BSD )

Naudodami grep įrankį galite ieškoti dabartiniame aplanke rekursyviai, pavyzdžiui:

 grep -r "class foo" . 

Pastaba: -r - ieškoti subkatalogų rekursiškai.

Taip pat galite naudoti „globbing“ sintaksę, jei norite ieškoti konkrečių failų, pavyzdžiui:

 grep "class foo" ***.* Visiems failams (išskyrus paslėptus ir be plėtinio) arba bet kuriam kitam šablonui. 

Jei turite klaidą, kad jūsų argumentas per ilgas, apsvarstykite galimybę susiaurinti paiešką arba naudokite, pavyzdžiui, find sintaksę:

 find . -name "*.php" -execdir grep -nH --color=auto foo {} ';' 

Arba galite naudoti „ ripgrep .

ripgrep

Jei dirbate su dideliais projektais ar dideliais failais, turėtumėte naudoti „ ripgrep :

 rg "class foo" . 

Pateikite dokumentų, diegimo žingsnių arba šaltinio kodo užsakymą GitHub projekto puslapyje .

Tai daug greičiau nei bet kuris kitas įrankis, pvz., GNU / BSD grep , ucg , ag , ucg , ack , pt ar panašus, nes jis yra pastatytas ant Rust reguliarios išraiškos mechanizmo, kuris greitai naudojasi ribinėmis būsenomis, SIMD ir agresyviais literatūra.

Jis palaiko „ .gitignore failuose nurodytus ignoravimo modelius, todėl vienu metu galima susieti vieną failo kelią su keliais „Glob“ modeliais.


Galite naudoti bendrus parametrus, pvz .:

  • -i - nejautri paieška.
  • -i - Ignoruoti dvejetainius.
  • -w - ieškoti visų žodžių ( -w iš dalinio žodžių atitikimo).
  • -n - rodyti rungtynių eilutę.
  • -C / --Context (pavyzdžiui, --Context ) - padidina kontekstą, todėl matote aplinkinį kodą.
  • --Color=auto - - --Color=auto atitinkamas tekstas.
  • -H - parodo failo, kuriame randamas tekstas, pavadinimą.
  • -C - rodo atitinkamų linijų skaičių. Galima derinti su -H .
41
09 мая '15 в 13:11 2015-05-09 13:11 atsakymas pateikiamas kenorb gegužės 09 '15 , 13:11 2015-05-09 13:11
 grep -insr "pattern" * 
  • i : ignoruokite skirtumus tiek PATTERNO, tiek įvesties failuose.
  • n : kiekvieno išėjimo linijos prefiksas su eilės numeriu 1 jo įvesties faile.
  • s : Išjunkite klaidų pranešimus apie neegzistuojančius ar neįskaitomus failus.
  • r : rekursyviai perskaitykite visus failus pagal kiekvieną katalogą.
38
26 февр. atsakymas pateikiamas 26 vasario mėn. 2016-02-26 08:47 '16 at 8:47 2016-02-26 08:47

Pabandykite:

 find . -name "*.txt" | xargs grep -i "text_pattern" 
27
10 дек. Atsakymą pateikė venkat 10 dec. 2014-12-10 08:47 '14 at 8:47 2014-12-10 08:47

Yra nauja „ The Silversearcher“ programa

 sudo apt install silversearcher-ag 

Jis glaudžiai bendradarbiauja su „Git“ ir kitomis VCS. Tokiu būdu jūs negausite nieko .git ar kitame kataloge.

Galite tiesiog naudoti

 ag -ia "Search query" 

Ir jis atliks šią užduotį jums!

26
04 нояб. atsakymą pateikė Neil Agarwal . 2016-11-04 00:30 '16 at 0:30 2016-11-04 00:30

Naudokite pwd norite ieškoti iš bet kurio katalogo, kuriame esate, rekursyvus žemyn.

 grep -rnw `pwd` -e "pattern" 

Atnaujinimas Priklausomai nuo naudojamo grep versijos, galite praleisti pwd . Naujesnėse versijose . atrodo kaip numatytasis „grep“ argumentas, jei katalogas nenurodytas.

grep -rnw -e "pattern"

arba

grep -rnw "pattern"

padarys tą patį, kaip pirmiau!

26
28 мая '16 в 15:47 2016-05-28 15:47 atsakymas duotas mahatmanich gegužės 28, 16, 15:47 2016-05-28 15:47

Kaip rasti visus failus, kuriuose yra konkretus tekstas „Linux“? (...)

Su šiuo sprendimu susidūriau du kartus:

find / -type f -exec grep -H 'text-to-find-Here' {} \;


Jei naudojate paiešką, kaip ir jūsų pavyzdyje, geriau įtraukti -s ( --no-messages ) į grep ir 2>/dev/null komandos pabaigoje, kad būtų išvengta daug pranešimų apie grep leidimus ir find :

 find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null 

rasti - standartinį failų paieškos įrankį - kartu su grep, kai ieškote konkretaus teksto - Unix tipo platformose. Beje , paieškos komanda dažnai derinama su xargs .

Tuo pačiu tikslu yra greitesni ir paprastesni įrankiai - žr. Žemiau. Geriau išbandykite juos, jei jie yra prieinami jūsų platformoje, žinoma:

Greitesnės, paprastesnės alternatyvos

„RipGrep“ yra greita paieškos priemonė:

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

Sidabro ieškiklis :

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

ack :

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

Pastaba Šias komandas taip pat galite pridėti 2>/dev/null , kad paslėptumėte daug klaidų pranešimų.


Įspėjimas : jei tikrai negalite to išvengti, nenorite ieškoti iš „/“ (šakninis katalogas), kad išvengtumėte ilgos ir neefektyvios paieškos! Todėl aukščiau pateiktuose pavyzdžiuose geriau „ / “ pakeisti vietovės pavadinimu, pvz., „/ Home“, priklausomai nuo to, kur tikrai norite ieškoti ...

20
25 нояб. Atsakymą pateikė Bludzee lapkričio 25 d. 2015-11-25 17:16 '15, 17:16, 2015-11-25 17:16

grep gali būti naudojamas net jei ieškome eilutės.

Tiesiog veikia

 grep -RIl "" . 

spausdina kelią į visus tekstinius failus, t. y. kuriuose yra tik spausdinamų simbolių.

18
09 апр. atsakymą pateikė Alexas Jasminas 09 balandis. 2014-04-09 22:51 '14, 10:51 pm 2014-04-09 22:51

Toliau pateikiamas komandų, kurias galima naudoti failui ieškoti, sąrašas.

 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 
16
01 февр. Atsakymas pateikiamas Atul Arvind 01 vasario mėn. 2014-02-01 08:47 '14 at 8:47 2014-02-01 08:47

Tikiuosi, kad tai padės ...

Išplėskite grep bitą, kad gautumėte papildomos informacijos, pavyzdžiui, norint gauti failo eilutės numerį, kur tekstas gali būti atliktas taip:

 find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext" 

Jei turite idėją apie failo tipą, galite susiaurinti paiešką, nurodydami paieškos tipų plėtinius, šiuo atveju .pas ARBA .pas failus:

 find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext" 

Trumpas parinkčių aprašymas:

  • . nurodo find iš dabartinio katalogo.
  • -name " *.* ": visiems failams ( *.pas " *.pas " -o- *.pas " *.pas "): tik *.pas OR *.dfm arba nurodyti su -o
  • -type f rodo, kad ieškote failų
  • -print0 ir - kitoje pusėje | (vamzdis) yra raktas, xargs failo pavadinimą iš „ find į „ grep , įterptą į xargs , kuris leidžia perkelti failų pavadinimus. Tarpų failų pavadinimuose, leidžiančiame „grep“ apdoroti kelią ir failo pavadinimą kaip vieną eilutę, o ne padalinti į kiekvieną vietą.
14
28 янв. Gert van Biljon atsakymas sausio 28 d 2015-01-28 09:42 '15 ne 9:42 2015-01-28 09:42

Paprasta find gali veikti patogiai. slapyvardis yra jūsų ~/.bashrc :

 alias ffind find / -type f | xargs grep 

Paleiskite naują terminalą ir atlikite išleidimą:

 ffind 'text-to-find-here' 
14
22 марта '17 в 15:30 2017-03-22 15:30 atsakymas pateikiamas danglingpointer kovo 22 d. 17 val. 15:30 2017-03-22 15:30

Pabandykite:

 find / -type f -exec grep -H 'text-to-find-here' {} \; 

kuri ieškos visų failų sistemų, nes / yra pagrindinis aplankas.

Jei norite naudoti pagrindinį aplanką:

 find ~/ -type f -exec grep -H 'text-to-find-here' {} \; 

Dabartiniam aplankui naudokite:

 find ./ -type f -exec grep -H 'text-to-find-here' {} \; 
13
04 мая '15 в 22:11 2015-05-04 22:11 atsakymą pateikė vartotojo4863663 gegužės 04 d. 15 val. 15:11 2015-05-04 22:11
 find /path -type f -exec grep -l "string" {} \; 

Pastabų paaiškinimas

rasti - tai komanda, leidžianti rasti failus ir kitus objektus, tokius kaip katalogai ir nuorodos tam tikro kelio pakatalogiuose. Jei nenurodote kaukės, su kuria turi būti įrašomi failų pavadinimai, jis nurodo visus katalogo objektus.

 -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 
13
02 июля '14 в 10:18 2014-07-02 10:18 atsakymą pateikė Vinod Joshi liepos 2 d. 14 d. 10:18 2014-07-02 10:18

Aš parašiau „ Python“ scenarijų, kuris tai daro. Štai kaip naudoti šį scenarijų.

 ./sniff.py path pattern_to_search [file_pattern] 

Pirmasis path argumentas yra katalogas, kuriame mes ieškosime rekursyvumo. Antrasis argumentas, pattern_to_search yra įprastinė išraiška, kurią norime rasti faile. Mes naudojame įprastą išraiškos formatą, apibrėžtą Python re bibliotekoje. Šiame scenarijuje yra simbolis . taip pat atitinka naują eilutę.

Trečiasis file_pattern argumentas yra neprivalomas. Tai dar viena įprastinė išraiška, kuri veikia su failo pavadinimu. Bus svarstomi tik tie failai, kurie atitinka šią įprastą išraišką.

Pvz., Jei noriu ieškoti „Python“ failų su plėtiniu „ py , kuriame yra „ Pool( po to - žodis „ Adaptor , aš darau šiuos veiksmus:

 ./sniff.py . "Pool(.*?Adaptor" .*py ./Demos/snippets/cubeMeshSigNeur.py:146 ./Demos/snippets/testSigNeur.py:259 ./python/moose/multiscale/core/mumbl.py:206 ./Demos/snippets/multiComptSigNeur.py:268 

Ir voiloje jis sukuria kelią į susijusius failus ir eilutės numerį, kuriuo buvo rastas atitikimas. Jei radote keletą atitikmenų, kiekvienas eilutės numeris bus pridėtas prie failo pavadinimo.

12
06 янв. Atsakymą pateikė Dilawar 06 sausis 2014-01-06 15:56 '14, 15:56, 2014-01-06 15:56

„Silver Searcher“ yra puikus įrankis, tačiau „ripgrep“ gali būti dar geriau.

Jis veikia „Linux“, „Mac“ ir „Windows“ sistemose ir buvo parašytas „ Hacker News“ prieš porą mėnesių (jis turi nuorodą į Andrew Gallant dienoraštį, kuriame yra „GitHub“ nuoroda):

Ripgrep - nauja komandų eilutės paieškos priemonė

12
13 дек. AAAfarmclub atsakymas, pateiktas gruodžio 13 d. 2016-12-13 08:48 '16 at 8:48 2016-12-13 08:48

Naudoti:

 grep -c Your_Pattern * 

Tai parodys, kiek jūsų šablono kopijų yra kiekviename dabartinio katalogo faile.

12
07 янв. atsakymas duotas Dr_Hope 07 Jan 2017-01-07 10:59 '17 at 10:59 2017-01-07 10:59

Grep yra tavo geras draugas, kad tai pasiektumėte.

 grep -r <text_fo_find> <directory> 

jei nereikia teksto paieškos, naudokite

 grep -ir <text_to_find> <directory> 
11
24 окт. atsakymas pateikiamas Prash 24 okt. 2017-10-24 06:07 '17 at 6:07 2017-10-24 06:07

Jei norite rasti eilutę ir rodyti tik šią eilutę su paieškos eilute:

 for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done 

pavyzdžiui:

 for i in $(find /usr/share/applications -type f); \ do grep -i "web browser" "$i"; done 

Jei norite rodyti failo pavadinimą, kuriame yra paieškos eilutė:

 for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done; 

pavyzdžiui:

 for i in $(find /usr/share/applications -type f); \ do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \ fi; done; 
10
25 янв. atsakymą pateikė user3124504 25 jan. 2014-01-25 14:08 '14, 14:08, 2014-01-25 14:08

Šiam požiūriui tinka ši komanda:

 find ./ -name "file_pattern_name" -exec grep -r "pattern" {} \; 
10
12 дек. Atsakymą pateikė „ Pradeep Goswami “ gruodžio 12 d. 2015-12-12 09:14 '15 at 9:14 2015-12-12 09:14

Pabandykite atlikti šiuos veiksmus:

 find . | xargs grep 'word' -sl 
9
15 дек. Atsakymą pateikė Tayab Hussain . 2014-12-15 13:10 '14, 13:10 2014-12-15 13:10

Kas mane patraukia, kaip paprastas grep tai daro su „rl“

 grep -rl 'pattern_to_find' /path/where/to/find -r to find recursively file / directory inside directories.. -l to list files matching the 'pattern' 

Naudokite „-r“ be „l“, kad pamatytumėte failų pavadinimus ir tekstą, kuriame yra šablonas !

 grep -r 'pattern_to_find' /path/where/to/find 

Jis veikia tik gerai.

Tikiuosi, kad tai padės!

9
08 авг. atsakymas pateikiamas nitinr708 08 rug . 2017-08-08 12:38 '17, 12:38 pm 2017-08-08 12:38

Yra „ ack įrankis, kuris padarys būtent tai, ko ieškote.

http://linux.die.net/man/1/ack

 ack -i search_string folder_path/* 

Galite ignoruoti -i atvejų jautrios paieškos atveju.

9
17 авг. atsakymas pateikiamas Pal 17 rug. 2016-08-17 06:31 '16 at 6:31 am 2016-08-17 06:31

Visi ankstesni atsakymai rodo grep ir rasti. Bet yra ir kitas būdas: naudoti vidurnakčio vadą

Tai nemokama programa (30 metų, laiko patikrinimas), kuri yra vizuali, o ne grafinė sąsaja. Ji turi daug funkcijų, failų paieška yra tik vienas iš jų.

9
22 июня '17 в 19:27 2017-06-22 19:27 atsakymą davė Petras M. birželio 22 d. 17, 19:27 2017-06-22 19:27

Galite naudoti toliau pateiktą komandą, nes jums nereikia failo pavadinimo, bet norite ieškoti iš visų failų. Čia aš būsiu „TEKSTAS“. Visi žurnalo failai, patvirtinantys, kad failo pavadinimas nėra spausdinamas

 grep -e TEXT *.log | cut -d' ' --complement -s -f1 

„grep“ su „-e“ parinktis yra gana greita, palyginti su kita parinktimi, kaip ir „PATTERN“ atitikčiai

9
26 июня '15 в 14:31 2015-06-26 14:31 Atsakymą pateikė Mitul Patel birželio 26 d. 15, 14:31 2015-06-26 14:31
  • 1
  • 2