Kaip rekursiškai rekursiškai?

Kaip rekursiškai grep visus katalogus ir pakatalogius?

 find . | xargs grep "texthere" * 
1460 m
01 янв. wpiri yra nustatytas sausio 01 2010-01-01 08:10 '10 8:10 val. 2010-01-01 08:10
@ 24 atsakymai
 grep -r "texthere" . 

Pirmasis parametras yra reguliari raiška, kuria ieškoma, o antrasis - ieškomas katalogas. Šiuo atveju . reiškia dabartinį katalogą.

Pastaba Tai veikia GNU grep, o kai kuriose platformose, pvz., „Solaris“, turite naudoti GNU grep, skirtingai nei senas įgyvendinimas. „Solaris“ tai yra ggrep komanda.

2199
01 янв. Atsakymą pateikė Vinko Vrsalovic 01 sausis 2010-01-01 08:11 '10, 8:11, 2010-01-01 08:11

Jei žinote failo, kurio jums reikia, išplėtimą ar modelį, kitas būdas yra naudoti --include parinktį:

 grep -r --include "*.txt" texthere . 

Taip pat galite nurodyti failus, kuriuos norite pašalinti su --exclude .

Ag

Jei dažnai žiūrite kodą, Ag („Silver Searcher“) yra daug greitesnė alternatyva grep, sukonfigūruota ieškoti kodo. Pavyzdžiui, pagal nutylėjimą ji yra rekursyvi ir automatiškai ignoruoja .gitignore sąraše išvardytus failus ir katalogus, taigi jums nereikia perduoti tų pačių didelių išimtinių galimybių grep arba find.

602
31 дек. Atsakymą pateikė Christangrant Dec 31. 2011-12-31 01:59 '12 ne 1:59 2011-12-31 01:59

Taip pat:

 find ./ -type f -print0 | xargs -0 grep "foo" 

bet geriausias atsakymas - grep -r .

118
01 янв. Atsakymas duotas Kurtui 01 sausio. 2010-01-01 08:14 '10, 8:14, 2010-01-01 08:14

Aš visada naudoju jį dabar (net Windows sistemoje su „ GoW“ - „Gnu“ sistemoje „Windows“ ):

 grep --include="*.xxx" -nRHI "my Text to grep" * 

Tai apima šias parinktis:

 --include=PATTERN 

Perrašo kataloguose tik failo, atitinkančio PATTERN .

 -n, --line-number 

Kiekvienos išvesties eilutės prefiksas su įvesties failo eilutės numeriu.

(Pastaba: phuclv prideda komentarus, kad -n sumažina našumą , todėl galite praleisti šią parinktį.)

 -R, -r, --recursive 

Perskaitykite visus kiekvieno katalogo failus, rekursyviai; tai atitinka „ -d recurse .

 -H, --with-filename 

Įveskite kiekvienos rungtynės failo pavadinimą.

 -I 

Apdorokite dvejetainį failą taip, tarsi jis neturėtų atitikmenų duomenų;
tai --binary-files=without-match parametrą --binary-files=without-match .

Ir aš galiu pridėti „ i “ ( -nRHIi ), jei noriu gauti -nRHIi registro rezultatus.

Galiu gauti:

 /home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" * src/GitList/Application.php:43: 'git.hidden' => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(), src/GitList/Provider/GitServiceProvider.php:21: $options['hidden'] = $app['git.hidden']; tests/InterfaceTest.php:32: $options['hidden'] = array(self::$tmpdir . '/hiddenrepo'); vendor/klaussilveira/gitter/lib/Gitter/Client.php:20: protected $hidden; vendor/klaussilveira/gitter/lib/Gitter/Client.php:170: * Get hidden repository list vendor/klaussilveira/gitter/lib/Gitter/Client.php:176: return $this->hidden; ... 
92
14 февр. Atsakymą pateikė VonC 14 vasario mėn. 2013-02-14 12:33 '13, 12:33, 2013-02-14 12:33

Arba nustatykite ack, jei norite daug greičiau ir daug.

53
01 янв. Atsakymą pateikė Andrew McGregor, Jan 01 2010-01-01 08:47 '10, 8:47, 2010-01-01 08:47

„POSIX“ sistemose „ grep nerasite -r parinkties, o „ grep -rn "stuff" . nebus pradėtas, bet jei naudosite find , jis:

find . -type f -exec grep -n "stuff" {} \; -print

Susitarta su „ Solaris ir „ HP-UX .

21
08 авг. atsakymas duodamas rook 08 rug. 2013-08-08 17:56 '13, 17:56, 2013-08-08 17:56

rijimas **

Naudojant grep -r darbus, tačiau jis gali perpildyti, ypač dideliuose aplankuose.

Norėdami daugiau praktinio naudojimo, čia yra sintaksė, kurioje naudojama sintaksė ( ** ):

 grep "texthere" **/*.txt 

kuri sujungia tik tam tikras rinkmenas su šablonu pasirinktu šablonu. Jis veikia palaikomiems korpusams, pvz., Bash +4 arba zsh.

Norėdami įjungti šią funkciją, paleiskite: shopt -s globstar .

Taip pat žiūrėkite: Kaip rasti visus failus, kuriuose yra konkretus tekstas „Linux“?

git grep

Projektams, kuriuos kontroliuoja „Git“ versija, naudokite:

 git grep "pattern" 

kuri yra daug greičiau.

ripgrep

Didesniems projektams greičiausias ripgrep įrankis yra ripgrep kuris pagal nutylėjimą atkartoja greps failus:

 rg "pattern" . 

Jis pagrįstas reguliarios Rust raiškos varikliu, kuris naudoja valstybės mašinas, SIMD ir agresyvius literatūros optimizavimus greitajai paieškai. Čia rasite išsamią analizę .

14
11 апр. atsakymas pateikiamas kenorb 11 d. 2018-04-11 13:12 '18, 13:12 pm, 2018-04-11 13:12

Jei norite rasti files kurių rekursyviai yra tam tikra string , pavadinimą, naudokite šią UNIX komandą:

 find . | xargs grep "searched-string" 

Linux :

 grep -r "searched-string" . 

rasti failą UNIX serveryje

 find . -type f -name file_name 

rasti failą „Linux“ serveryje

 find . -name file_name 
11
29 янв. Girdhar Singh Rathore atsakymas Jan 29 2016-01-29 17:31 '16 at 17:31 pm 2016-01-29 17:31

tik failų pavadinimai gali būti naudingi

 grep -r -l "foo" . 
10
03 дек. atsakymas pateikiamas chimoje 03 dec. 2012-12-03 20:48 '12 at 8:48 pm 2012-12-03 20:48

ag yra mano mėgstamiausias būdas tai padaryti dabar github.com/ggreer/the_silver_searcher . Tai iš esmės yra tokia pati, kaip ir ack, bet su keliais optimizavimais.

Čia yra trumpas testas. Prieš kiekvieną testą išvalau talpyklą (žr. Https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-tememory-cache )

 ryan@3G08$ sync  echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryan@3G08$ time grep -r "hey ya" . real 0m9.458s user 0m0.368s sys 0m3.788s ryan@3G08:$ sync  echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryan@3G08$ time ack-grep "hey ya" . real 0m6.296s user 0m0.716s sys 0m1.056s ryan@3G08$ sync  echo 3 | sudo tee /proc/sys/vm/drop_caches 3 ryan@3G08$ time ag "hey ya" . real 0m5.641s user 0m0.356s sys 0m3.444s ryan@3G08$ time ag "hey ya" . #test without first clearing cache real 0m0.154s user 0m0.224s sys 0m0.172s 
8
22 мая '14 в 2:37 2014-05-22 02:37 atsakymas pateikiamas dranxo gegužės 22 d., 14 val. 2:37 2014-05-22 02:37

Jei norite sekti tik faktinius katalogus, o ne simbolines nuorodas,

 grep -r "thingToBeFound" directory 

Jei norite sekti simbolines nuorodas, taip pat faktinius katalogus (būkite atsargūs su begaline rekursija),

 grep -R "thing to be found" directory 

Stengdamiesi rekursyviai, jums gali būti naudingi šie parametrai:

 -H: outputs the filename with the line -n: outputs the line number in the file 

Taigi, jei norite surasti visus failus, kuriuose yra Darth Vader dabartiniame kataloge arba bet kuriame subkataloge, ir užfiksuoti failo pavadinimą ir eilutės numerį, bet nenorite, kad rekursas atitiktų simbolines nuorodas, komanda būtų

 grep -rnH "Darth Vader" . 

Jei norite rasti visas nuorodas į žodį katė kataloge

 /home/adam/Desktop/TomAndJerry 

ir esate kataloge

 /home/adam/Desktop/WorldDominationPlot 

ir norite parašyti failo pavadinimą, bet ne eilutės „katė“ eilutės numerį, ir norite, kad rekursas atitiktų simbolines nuorodas, jei jas aptinka, galite paleisti bet kurį iš toliau nurodytų

 grep -RH "cats" ../TomAndJerry #relative directory grep -RH "cats" /home/adam/Desktop/TomAndJerry #absolute directory 

Šaltinis:

grep --help veikia

Trumpas įvadas į simbolinius ryšius tiems, kurie skaito šį atsakymą ir kuriuos painioja mano nuoroda į juos: https://www.nixtutor.com/freebsd/understanding-symbolic-links/

8
03 авг. atsakymą pateikė SarcasticSully 03 rug. 2016-08-03 23:08 '16 at 23:08 2016-08-03 23:08

Jei ieškote konkretaus turinio visuose katalogų struktūros failuose, galite naudoti find , nes aiškiau, ką darote:

 find -type f -exec grep -l "texthere" {} + 

Atkreipkite dėmesį, kad -l (mažoji L) rodo failo, kuriame yra tekstas, pavadinimą. Jei norite spausdinti rungtynes, ją ištrinkite. Arba naudokite -H kad gautumėte failą su rungtynėmis. Visi kartu, kitos alternatyvos:

 find -type f -exec grep -Hn "texthere" {} + 

Kur -n spausdina eilutės numerį.

6
30 нояб. atsakymas pateikiamas fedorqui lapkričio 30 d 2015-11-30 19:19 '15, 19:19, 2015-11-30 19:19

Tai yra tas, kuris dirbo mano atveju mano dabartinėje mašinoje (git bash Windows 7):

 find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern" 

Aš visada pamiršiu -print0 ir -0 keliams su tarpais.

EDIT: dabar mano pageidaujamas įrankis vietoj ripgrep: https://github.com/BurntSushi/ripgrep/releases . Jis yra labai greitas ir turi geresnes numatytas reikšmes (pvz., Rekursiniai numatytieji nustatymai). Panašus pavyzdys, kaip ir mano pirminis atsakymas, bet naudojant ripgrep: rg -g "*.cs" "content pattern"

6
07 апр. atsakymas pateikiamas arkod 07 balandžio. 2016-04-07 13:05 '16, 13:05 pm 2016-04-07 13:05

Tai turėtų veikti:

 grep -R "texthere" * 
5
19 дек. atsakymą pateikė sumit kumar 19 dec. 2013-12-19 10:20 '13, 10:20, 2013-12-19 10:20

grep -r "texthere" . (įspėjimo laikotarpis pabaigoje)

(^ kreditas: ngn-wiki.ru.site/questions/1206 / ... )


Paaiškinimas:

grep -r "texthere" / (rekursyviai grep visus katalogus ir pakatalogius)

grep -r "texthere" . (rekursyviai grep šiuos katalogus ir pakatalogius)

grep rekursyvus

grep [options] PATTERN [FILE...]

[parinktis]

-R, -r, --recursive

Perskaitykite visus katalogus kiekviename kataloge.

Tai yra lygi -d recurse arba --directories=recurse .

http://linuxcommand.org/man_pages/grep1.html

„grep“ pagalba

$ grep --help

 $ grep --help |grep recursive -r, --recursive like --directories=recurse -R, --dereference-recursive 

Alternatyvos

ack ( http://beyondgrep.com/ )

ag ( http://github.com/ggreer/the_silver_searcher )

4
13 февр. Geoffrey Hale atsakė 13 vasario mėn 2016-02-13 01:56 '16 at 1:56 2016-02-13 01:56

Toliau yra komanda, skirta ieškoti String rekursyviai Unix ir Linux .

Unix komandai:

 find . -name "string to be searched" -exec grep "text" "{}" \; 

Linux komandai:

 grep -r "string to be searched" . 
3
08 марта '16 в 10:32 2016-03-08 10:32 atsakymą pateikė Girdhar Singh Rathore kovo 8 d. 16 d. 10:32 2016-03-08 10:32

Mano „IBM AIX“ serveryje (OS versija: AIX 5.2) naudokite:

 find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

tai faile išspausdins kelio / failo pavadinimą ir santykinį eilutės numerį, pavyzdžiui:

./incl/xxxx_x.h

2865: / ** Aprašymas: stringYouWannaFind * /

bet kuriuo atveju, tai veikia man :)

3
09 июля '15 в 12:37 2015-07-09 12:37 atsakymą pateikė vartotojo3606336 liepos 09 '15 , 12:37 2015-07-09 12:37

2018 m. Norite naudoti „ ripgrep arba the-silver-searcher nes jie yra greitesni už alternatyvas.

Čia yra katalogas su 336 pirmos pakopos katalogais:

 % find . -maxdepth 1 -type d | wc -l 336 % time rg -w aggs -g '*.py' ... rg -w aggs -g '*.py' 1.24s user 2.23s system 283% cpu 1.222 total % time ag -w aggs -G '.*py$' ... ag -w aggs -G '.*py$' 2.71s user 1.55s system 116% cpu 3.651 total % time find ./ -type f -name '*.py' | xargs grep -w aggs ... find ./ -type f -name '*.py' 1.34s user 5.68s system 32% cpu 21.329 total xargs grep -w aggs 6.65s user 0.49s system 32% cpu 22.164 total 

OSX sistemoje diegiama ripgrep : brew install ripgrep . Tai įdiegia silver-searcher : brew install the_silver_searcher .

2
09 янв. atsakymas pateikiamas hughdbrown sausio 09 2018-01-09 20:30 '18, 20:30, 2018-01-09 20:30

Manau, kad tai yra tai, ką bandote rašyti

 grep myText $(find .) 

ir tai gali būti naudinga, jei norite surasti grep failus

 grep myText $(find .) | cut -d : -f 1 | sort | uniq 
2
03 окт. Victor Faria atsakymas, pateiktas spalio 3 d 2016-10-03 23:27 '16 at 23:27 pm 2016-10-03 23:27

Atminkite, kad find . -type f | xargs grep whatever find . -type f | xargs grep whatever find . -type f | xargs grep whatever sprendimai bus paleisti klaidų sąraše „Argumentų sąrašas ilgiems“, kai per daug failų atitinka paiešką.

Geriausias statymas yra grep -r , bet jei tai neįmanoma, naudokite find . -type f -exec grep -H whatever {} \; find . -type f -exec grep -H whatever {} \; .

1
21 мая '14 в 21:12 2014-05-21 21:12 atsakymas pateikiamas m.thome gegužės 21, 14, 21:12 2014-05-21 21:12

Galimų vėliavų sąrašas:

 grep --help 

Grąžina visus regexp teksto raiškos atitikmenis dabartiniame kataloge su atitinkamu eilutės numeriu:

 grep -rn "texthere" . 

Grąžina visus teksto atitikmenis, pradedant nuo šakninio katalogo su atitinkamu eilutės numeriu ir ignoruojant atvejį:

 grep -rni "texthere" / 

čia naudojamos vėliavos:

  • -r rekursinis
  • -n spausdinimo linijos numeris su išėjimu
  • -i ignoruoju atvejį
1
01 окт. atsakymas pateiktas JSON C11 01 okt. 2017-10-01 01:50 '17 at 1:50 2017-10-01 01:50

Tiesiog įdomus, greitas ir purvinas * .txt failų ieškojimas, jei atsakymas @christangrant yra per daug, kad galėtumėte įvesti: -)

grep -r texthere .|grep .txt

1
12 авг. Atsakymą pateikė PJ Brunet 12 rug. 2015-08-12 22:14 '15 , 10:14 val. 2015-08-12 22:14

Čia rekursyvus (lengvai patikrinamas su bash ir sh funkcija), kuris perkelia visus tam tikro aplanko poaplankius ($ 1) ir naudojasi grep paieškomis tam tikroje eilutėje ($ 3) nurodytuose failuose ($ 2):

 $ cat script.sh #!/bin/sh cd "$1" loop () { for i in * do if [ -d "$i" ] then # echo entering "$i" cd "$i" loop "$1" "$2" fi done if [ -f "$1" ] then grep -l "$2" "$PWD/$1" fi cd .. } loop "$2" "$3" 

Pavyzdžio rodymas ir rodymas:

 $ sh script start_folder filename search_string /home/james/start_folder/dir2/filename 
0
09 июня '17 в 18:21 2017-06-09 18:21 Atsakymą davė Jamesas Brownas birželio 17 d. 17 val. 21:21 2017-06-09 18:21
 The syntax is: cd /path/to/dir grep -r <"serch_word name"> . 
-2
18 янв. Atsakymas duotas Poo Jan 18 2016-01-18 11:28 '16 at 11:28 2016-01-18 11:28

Kiti klausimai apie „ žymes arba Užduoti klausimą