Hoe kan ik mappen uitsluiten van grep -R?

Ik wil alle submappen doorlopen, behalve de map “node_modules”.


Antwoord 1, autoriteit 100%

OPLOSSING 1 (combineer finden grep)

Het doel van deze oplossing is niet om de prestaties van grepaan te pakken, maar om een ​​draagbare oplossing te tonen: zou ook moeten werken met busybox- of GNU-versie ouder dan 2.5.

Gebruik findom mappen foo en bar uit te sluiten:

find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print

Combineer vervolgens finden het niet-recursieve gebruik van grep, als een draagbare oplossing:

find /dir \( -name node_modules -prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;

OPLOSSING 2 (met behulp van de --exclude-diroptie van grep):

U kent deze oplossing al, maar ik voeg deze toe omdat dit de meest recente en efficiënte oplossing is. Merk op dat dit een minder draagbare oplossing is, maar beter leesbaar voor mensen.

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

Om meerdere mappen uit te sluiten, gebruikt u --exclude-dirals:

--exclude-dir={node_modules,dir1,dir2,dir3}

OPLOSSING 3 (Ag)

Als je vaak door code zoekt, is Ag (The Silver Searcher)een veel sneller alternatief voor grep , dat is aangepast voor het zoeken naar code. Het negeert bijvoorbeeld automatisch bestanden en mappen die worden vermeld in .gitignore, zodat u niet steeds dezelfde omslachtige uitsluitingsopties hoeft door te geven aan grepof find.


Antwoord 2, autoriteit 93%

Recente versies van GNU Grep(>= 2.5.2) bieden:

--exclude-dir=dir

die mappen die overeenkomen met het patroon diruitsluit van recursieve zoekacties in directory’s.

Dus je kunt het volgende doen:

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

Voor wat meer informatie over syntaxis en gebruik, zie

Voor oudere GNU Greps en POSIX Grep, gebruik findzoals gesuggereerd in andere antwoorden.

Of gebruik gewoon ack(Bewerken : of The Silver Searcher) en klaar ermee!


Antwoord 3, autoriteit 18%

Als u meerdere mappenwilt uitsluiten:

“r” voor recursief, “l” om alleen namen af ​​te drukken van bestanden die overeenkomsten bevatten en “i” om onderscheid tussen hoofdletters en kleine letters te negeren :

grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search

Voorbeeld: ik wil bestanden zoeken die het woord ‘hallo’ bevatten. Ik wil zoeken in al mijn linux-directory’s behalveprocdirectory, bootdirectory, sysdirectory en hoofdmap:

grep -rli --exclude-dir={proc,boot,root,sys} hello /

Opmerking: het bovenstaande voorbeeld moet root zijn

Opmerking 2 (volgens @skplunkerin): voeg geen spaties toe na de komma’s in{dir1,dir2,dir3}


Antwoord 4, autoriteit 10%

Deze syntaxis

--exclude-dir={dir1,dir2}

wordt uitgebreid door de shell (bijv. Bash), niet door grep, in dit:

--exclude-dir=dir1 --exclude-dir=dir2

Citeer zal voorkomen dat de shell het uitbreidt, dus dit zal niet werken:

--exclude-dir='{dir1,dir2}'    <-- this won't work

De patronen die worden gebruikt met --exclude-dirzijn dezelfde soort patronen die worden beschreven in de man-pagina voor de optie files:

--exclude=GLOB
    Skip files whose base name matches GLOB (using wildcard matching).
    A file-name glob can use *, ?, and [...]  as wildcards, and \ to
    quote a wildcard or backslash character literally.

De shell zal over het algemeen proberenzo’n patroon zelf uit te breiden, dus om dit te voorkomen, moet je het citeren:

--exclude-dir='dir?'

U kunt de accolades en geciteerde uitsluitingspatronen als volgt samen gebruiken:

--exclude-dir={'dir?','dir??'}

Antwoord 5, autoriteit 3%

Als je code zoekt in een git-repository en node_moduleszich in je .gitignorebevindt, kun je git grepgebruiken. git grepdoorzoekt de bijgehouden bestanden in de werkboom en negeert alles van .gitignore

git grep "STUFF"

Antwoord 6, autoriteit 3%

Gebruik dit vaak:

grepkan worden gebruikt in combinatie met -r(recursief), i(negeer hoofdletters) en -o(print alleen overeenkomende delen van regels af). Gebruik filesom --excludeuit te sluiten en gebruik --exclude-dirom mappen uit te sluiten.

Als je het samenvoegt, krijg je zoiets als:

grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>

Als je het beschrijft, klinkt het veel ingewikkelder dan het in werkelijkheid is. Makkelijker te illustreren met een eenvoudig voorbeeld.

Voorbeeld:

Stel dat ik op zoek ben naar het huidige project voor alle plaatsen waar ik de tekenreekswaarde debuggerexpliciet heb ingesteld tijdens een foutopsporingssessie en nu wil bekijken / verwijderen.

Ik schrijf een script met de naam findDebugger.shen gebruik grepom alle gebeurtenissen te vinden. Maar:

Voor bestandsuitsluitingen – ik wil ervoor zorgen dat .eslintrcwordt genegeerd (dit heeft eigenlijk een linting-regel over debuggeren moet dus worden uitgesloten). Evenzo wil ik niet dat er in de resultaten naar mijn eigen script wordt verwezen.

Voor directory-uitsluitingen – ik wil node_modulesuitsluiten omdat het veel bibliotheken bevat die verwijzen naar debuggeren ik ben niet geïnteresseerd in die resultaten. Ik wil ook gewoon de verborgen mappen .ideaen .gitweglaten omdat ik die zoeklocaties ook niet belangrijk vind en ik de zoekactie goed wil houden.

Dus hier is het resultaat – ik maak een script met de naam findDebugger.shmet:

#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .

Antwoord 7, autoriteit 2%

Je zou iets als grep -R search . | grep -v '^node_modules/.*'


Antwoord 8

Er zijn hier veel juiste antwoorden gegeven, maar ik voeg deze toe om één punt te benadrukken dat ervoor zorgde dat enkele overhaaste pogingen eerder mislukten: exclude-dirneemt een patroon, geen pad naar een map.

Stel dat uw zoekopdracht is:

grep -r myobject

En je merkt dat je uitvoer vol zit met resultaten uit de src/other/objects-folder. Dit commando geeft niethet beoogde resultaat:

grep -r myobject --exclude-dir=src/other/objects-folder

En je vraagt ​​je misschien af ​​waarom exclude-dirniet werkt! Om resultaten daadwerkelijk uit te sluiten van de objects-folder, doet u dit eenvoudig:

grep -r myobject --exclude-dir=objects-folder

Met andere woorden, gebruik gewoon de mapnaam, niet het pad. Duidelijk als je het eenmaal weet.

Van de man-pagina:

–exclude-dir=GLOB
Sla elke opdrachtregeldirectory over met een naamachtervoegsel dat overeenkomt met het patroon GLOB. Wanneer
recursief zoeken, sla elke submap over waarvan de basisnaam overeenkomt met GLOB. Negeer elke
overbodige slashes in GLOB.


Antwoord 9

Zeer handig, vooral voor degenen die te maken hebben met Node.jswaar we naartoe willen vermijd zoeken in “node_modules”:

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword

Antwoord 10

Een eenvoudig werkcommando:

root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"

Hierboven grep ik voor tekst “creativecommons.org” in de huidige map “dspace” en sluit dirs {log,assetstore} uit.

Gereed.


Antwoord 11

Deze werkt voor mij:

grep <stuff> -R --exclude-dir=<your_dir>

Antwoord 12

find . ! -name "node_modules" -type d 

Antwoord 13

Stap 1:

vim ~/.bash_profile

search() {
    grep -InH -r --exclude-dir=*build*  -e "$1" .
}

Stap 2:

source ~/.bash_profile

Gebruik:

search "<string_to_be_searched>"


Antwoord 14

Een eenvoudigere manier zou zijn om uw resultaten te filteren met “grep -v”.

grep -i needle -R * | grep -v node_modules

LEAVE A REPLY

Please enter your comment!
Please enter your name here

2 + 16 =

Other episodes