Vraag Hoe kan ik recursief grepelen?


Hoe kom ik recursief grep alle mappen en submappen?

find . | xargs grep "texthere" *

1347
2018-01-01 05:10


oorsprong


antwoorden:


grep -r "texthere" .

De eerste parameter vertegenwoordigt de reguliere expressie waarnaar moet worden gezocht, terwijl de tweede parameter de directory vertegenwoordigt waarnaar moet worden gezocht. In dit geval, . betekent de huidige map.

Opmerking: dit werkt voor GNU grep en op sommige platforms zoals Solaris moet u GNU grep specifiek gebruiken in tegenstelling tot legacy-implementatie. Voor Solaris is dit het ggrep opdracht.


2030
2018-01-01 05:11



Als u de extensie of het patroon kent van het bestand dat u wilt, is een andere methode om te gebruiken --include keuze:

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

U kunt ook de bestanden vermelden waarmee u wilt uitsluiten --exclude.

ag

Als u vaak door code zoekt, Ag (The Silver Searcher) is een veel sneller alternatief voor grep, dat is aangepast voor het zoeken van code. Het is bijvoorbeeld standaard recursief en negeert automatisch bestanden en mappen die worden vermeld in .gitignore, dus je hoeft niet steeds dezelfde logge opties voor uitsluiten om te grepen of te vinden over te slaan.


568
2017-12-30 22:59



Ook:

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

maar grep -r is een beter antwoord.


106
2018-01-01 05:14



Ik gebruik nu altijd (zelfs op Windows met GoW - Gnu op Windows):

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

Dat omvat de volgende opties:

--include=PATTERN

Recurse in mappen die alleen zoeken naar bestandsvergelijking PATTERN.

-n, --line-number

Prefix elke regel van uitvoer met het regelnummer in het invoerbestand.

-R, -r, --recursive

Lees alle bestanden onder elke map recursief; dit is gelijk aan de -d recurse keuze.

-H, --with-filename

Print de bestandsnaam voor elke wedstrijd.

-I     

Verwerk een binair bestand alsof het geen overeenkomende gegevens bevat;
  dit is gelijk aan de --binary-files=without-match keuze.

En ik kan toevoegen 'i'(-nRHIi), als ik niet-hoofdlettergevoelige resultaten wil.

Ik kan krijgen:

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

83
2018-02-14 09:33



Of installeer ack, als je een veel snellere manier wilt en dit veel doet.


53
2018-01-01 05:47



In POSIX-systemen vindt u het niet -r parameter voor grep en jouw grep -rn "stuff" . zal niet lopen, maar als je gebruikt find commando het zal:

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

Akkoord met Solaris en HP-UX.


19
2017-08-08 14:56



Om de naam van te vinden files met path recursief met de specifieke string gebruik onderstaande opdracht voor UNIX:

find . | xargs grep "searched-string"

voor Linux:

grep -r "searched-string" .

zoek een bestand op UNIX server

find . -type f -name file_name

vind een bestand op LINUX-server

find . -name file_name

10
2018-01-29 14:31



ag is mijn favoriete manier om dit nu te doen github.com/ggreer/the_silver_searcher . Het is eigenlijk hetzelfde als ack maar met een paar meer optimalisaties.

Hier is een korte benchmark. Ik wis de cache voor elke test (cf. https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-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
2018-05-21 23:37



Als u alleen de werkelijke mappen wilt volgen, en geen symbolische koppelingen,

grep -r "thingToBeFound" directory

Als u symbolische koppelingen en feitelijke mappen wilt volgen (let op oneindige recursie),

grep -R "thing to be found" directory

Omdat u recursief probeert te grepelen, kunnen de volgende opties ook nuttig voor u zijn:

-H: outputs the filename with the line

-n: outputs the line number in the file

Dus als je alle bestanden met Darth Vader in de huidige map of subdirectories wilt vinden en de bestandsnaam en het regelnummer wilt vastleggen, maar niet wilt dat de recursie symbolische links volgt, zou de opdracht

grep -rnH "Darth Vader" .

Als je alle vermeldingen van het woord kat in de map wilt vinden

/home/adam/Desktop/TomAndJerry 

en je bevindt je momenteel in de directory

/home/adam/Desktop/WorldDominationPlot

en je wilt de bestandsnaam maar niet het regelnummer van een instantie van de string "katten" vastleggen, en je wilt dat de recursie symbolische links volgt als het ze vindt, je zou een van de volgende kunnen uitvoeren

grep -RH "cats" ../TomAndJerry                   #relative directory

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

Bron:

"grep --help" uitvoeren

Een korte inleiding tot symbolische koppelingen, voor iedereen die dit antwoord leest en verward door mijn verwijzing ernaar: https://www.nixtutor.com/freebsd/understanding-symbolic-links/


8
2017-08-03 20:08



alleen de bestandsnamen kunnen ook nuttig zijn

grep -r -l "foo" .

8
2017-12-03 17:48



Dit zou moeten werken:

grep -R "texthere" *

5
2017-12-19 07:20