Ik wil alle submappen doorlopen, behalve de map “node_modules”.
Antwoord 1, autoriteit 100%
OPLOSSING 1 (combineer find
en grep
)
Het doel van deze oplossing is niet om de prestaties van grep
aan te pakken, maar om een draagbare oplossing te tonen: zou ook moeten werken met busybox- of GNU-versie ouder dan 2.5.
Gebruik find
om mappen foo en bar uit te sluiten:
find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print
Combineer vervolgens find
en 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-dir
optie 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-dir
als:
--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 grep
of find
.
Antwoord 2, autoriteit 93%
Recente versies van GNU Grep(>= 2.5.2) bieden:
--exclude-dir=dir
die mappen die overeenkomen met het patroon dir
uitsluit 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
- De GNU-manpagina voor Bestand en directory Selectie
- Een gerelateerd StackOverflow-antwoord Gebruik grep –exclude/–include syntaxis om niet door bepaalde bestanden te gaan
Voor oudere GNU Greps en POSIX Grep, gebruik find
zoals 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-dir
zijn 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_modules
zich in je .gitignore
bevindt, kun je git grep
gebruiken. git grep
doorzoekt de bijgehouden bestanden in de werkboom en negeert alles van .gitignore
git grep "STUFF"
Antwoord 6, autoriteit 3%
Gebruik dit vaak:
grep
kan worden gebruikt in combinatie met -r
(recursief), i
(negeer hoofdletters) en -o
(print alleen overeenkomende delen van regels af). Gebruik files
om --exclude
uit te sluiten en gebruik --exclude-dir
om 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 debugger
expliciet heb ingesteld tijdens een foutopsporingssessie en nu wil bekijken / verwijderen.
Ik schrijf een script met de naam findDebugger.sh
en gebruik grep
om alle gebeurtenissen te vinden. Maar:
Voor bestandsuitsluitingen – ik wil ervoor zorgen dat .eslintrc
wordt genegeerd (dit heeft eigenlijk een linting-regel over debugger
en 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_modules
uitsluiten omdat het veel bibliotheken bevat die verwijzen naar debugger
en ik ben niet geïnteresseerd in die resultaten. Ik wil ook gewoon de verborgen mappen .idea
en .git
weglaten 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.sh
met:
#!/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-dir
neemt 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-dir
niet 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