मैं grep -R से निर्देशिकाओं को कैसे छोड़ सकता हूं?


668

"नोड_मॉड्यूल" निर्देशिका को छोड़कर, मैं सभी उपनिर्देशिकाओं को पार करना चाहता हूं।



14
बस टाइप "आदमी grep" और आप --exclude देखेंगे, और वहीं सूचीबद्ध --exclude-निर्देशिका विकल्प - इस सवाल के शीर्षक से, मैं यह सोचते हैं आप पहले से ही कर रहा हूँ ग्रेप बारे में पता था ...
arcseldon

34
यदि आप git रिपॉजिटरी में कोड के लिए grepping कर रहे हैं और node_modulesआपके पास है .gitignore, git grep "STUFF"तो सबसे आसान तरीका है। git grepखोजें काम कर पेड़ में ट्रैक फ़ाइलें, से सब कुछ अनदेखी.gitignore
0xcaff

2
नोड के लिए एक उदाहरण: grep -R --exclude-dir={node_modules,bower_components} "MyString" | cut -c1-"$COLUMNS"- आगे आप इसे हमेशा शेल में 'नोडग्रेप' या जो भी हो और स्ट्रिंग इनपुट के रूप में कमांड तर्क का उपयोग कर सकते हैं ..
bshea

जवाबों:


394

समाधान 1 (संयोजन findऔर grep)

इस समाधान का उद्देश्य grepप्रदर्शन से निपटने के लिए नहीं है, बल्कि एक पोर्टेबल समाधान दिखाने के लिए है: 2.5 से अधिक पुराने बिजीबॉक्स या जीएनयू संस्करण के साथ भी काम करना चाहिए।

findनिर्देशिका फू और बार को बाहर करने के लिए उपयोग करें :

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

फिर संयोजन findऔर गैर-पुनरावर्ती उपयोग grep, एक पोर्टेबल समाधान के रूप में:

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

समाधान 2 (पुनरावर्ती उपयोग grep):

आप इस समाधान को पहले से ही जानते हैं, लेकिन मैं इसे सबसे हाल ही में और कुशल समाधान के बाद से जोड़ता हूं। ध्यान दें कि यह एक कम पोर्टेबल समाधान है लेकिन अधिक मानव पठनीय है।

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

कई निर्देशिकाओं को बाहर करने के लिए, --exclude-dirनिम्न का उपयोग करें :

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

समाधान 3 (एजी)

यदि आप बार-बार कोड के माध्यम से खोज करते हैं, तो Ag (The Silver Searcher) grep का एक अधिक तेज़ विकल्प है, जो कोड खोजने के लिए अनुकूलित है। उदाहरण के लिए, यह स्वचालित रूप से फ़ाइल और निर्देशिका में सूचीबद्ध पर ध्यान नहीं देता .gitignoreहै, तो आप के लिए एक ही बोझिल विकल्पों गुजर को बाहर रखने के लिए की जरूरत नहीं है grepया find


2
यह संयोजन तेजी से खोज करता है --exclude-dir=dirऔर यह रंगों के साथ परिणाम दिखाता है - पढ़ने में आसान
मैक्सिम येफ्रेमोव

27
"यह संयोजन" मेरे लिए find ... -execअधिक तेज़ नहीं grep --exclude-dirहै। बड़े लाभ (लगभग 26 गुना + 26k + फ़ाइलों के साथ तेजी से, 38k + एक एचडीडी से फ़िल्टर किए गए), जब तक कि आप ढूंढने / निष्पादित कॉम्बो के \;साथ प्रतिस्थापित नहीं +करते हैं। फिर grep "केवल" लगभग 30% तेजी से होता है। Grep सिंटैक्स भी मानव-पठनीय है :)।
केजेल एंड्रियासेन

सहमत, चूंकि यह स्पष्ट है। कुछ बिजीबॉक्स में GREP कमांड नहीं है।
सींगेटबज

10
यह भी ध्यान में रखते हुए कि आप --exclude-dir={dir1,dir2}
suh

4
मैं कम से कम हैरान नहीं हूं कि node_modulesयह विहित उदाहरण है।
पोदेरहिट्टी २

982

जीएनयू ग्रीप के हाल के संस्करण (> = 2.5.2 ) प्रदान करते हैं:

--exclude-dir=dir

जो dirपुनरावर्ती निर्देशिका खोजों से पैटर्न से मेल खाते निर्देशिकाओं को बाहर करता है।

तो आप कर सकते हैं:

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

वाक्यविन्यास और उपयोग के संबंध में थोड़ी अधिक जानकारी के लिए देखें

पुराने GNU ग्रेप्स और POSIX Grep के लिए , findअन्य उत्तरों में सुझाए अनुसार उपयोग करें ।

या बस का उपयोग करें ack( संपादित करें : या रजत खोजक ) और इसके साथ किया जा सकता है!


4
@Manocho: यदि आपको लगता ackहै कि महान है, तो सिल्वर खोजक को आज़माएं और गति में वृद्धि देखें!
जॉन्सवेब

30
अधीर के लिए सिंटेक्स: --exclude-dir=dirका उपयोग करता है grepके नियमित अभिव्यक्ति पैटर्न, नहीं खोल की फाइल ग्लोबिंग। पैटर्न आपकी वर्तमान निर्देशिका के सापेक्ष पथ पर काम करते हैं। तो पैटर्न का उपयोग करें --exclude-dir=dir, नहीं --exclude-dir="/root/dir/*"
टैनिअस

15
यदि आप खोज से कई डायर को बाहर करना चाहते हैं, तो क्या इसका उपयोग करने से बेहतर विकल्प है $ grep -r --exclude-dir=dir1 --exclude-dir=dir2 "string" /path/to/search/dir:?
दर्शन चौधरी

4
मैंने शायद किसी भी समझदार व्यक्ति की तुलना में इस पर बहुत अधिक समय बिताया है, लेकिन मैं अपने जीवन के लिए यह पता नहीं लगा सकता कि खोज से एक उपनिर्देशिका को कैसे हटाया जाए - grep -r --exclude-dir=public keyword .काम करता है, लेकिन grep -r --exclude-dir='public/dist' keyword .नहीं। मैं regex वाइल्डकार्ड जोड़ने की कोशिश की, पात्रों से बचने आदि, लेकिन मदद करने के लिए कुछ भी नहीं लगता है।
dkobozev

72
जैसे कई निर्देशिकाओं को छोड़ दें:grep -r "Request" . --exclude-dir={node_modules,git,build}
maverick97

77

यदि आप कई निर्देशिकाओं को बाहर करना चाहते हैं :

"आर" पुनरावर्ती के लिए, "एल" केवल मैच वाले फाइलों के नाम मुद्रित करने के लिए और "आई" मामले के भेदों को अनदेखा करने के लिए:

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

उदाहरण: मैं ऐसी फाइलें ढूंढना चाहता हूं जिनमें 'हैलो' शब्द हो। मैं अपने सभी linux निर्देशिका में खोज करना चाहते हैं को छोड़कर proc निर्देशिका, बूट निर्देशिका, सिस निर्देशिका और जड़ निर्देशिका:

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

नोट: ऊपर दिए गए उदाहरण का मूल होना चाहिए

नोट 2 (@skplunkerin के अनुसार): अल्पविराम के बाद रिक्त स्थान न जोड़ें {dir1,dir2,dir3}


5
ध्यान दें: अल्पविराम के बाद रिक्त स्थान न जोड़ें{dir1,dir2,dir3}
skplunkerin

धन्यवाद, एसवीएन कार्यक्षेत्र के माध्यम से grep'ing जब काम करें:grep -Irsn --exclude-dir=.svn 'foo' .
RAM237

1
आप --exclude-dirकई बार विकल्प प्रदान कर सकते हैं ।
वाल्फ

44

यह वाक्य रचना

--exclude-dir={dir1,dir2}

इसका विस्तार शेल द्वारा किया जाता है (जैसे बैश), इसके द्वारा नहीं grep:

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

कोटेशन शेल को विस्तार करने से रोकेगा, इसलिए यह काम नहीं करेगा:

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

के साथ प्रयोग किया पैटर्न --exclude-dirके लिए आदमी पृष्ठ में वर्णित पैटर्न के एक ही तरह हैं --excludeविकल्प:

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

शेल आमतौर पर इस तरह के एक पैटर्न का विस्तार करने की कोशिश करेगा , इसलिए इससे बचने के लिए, आपको इसे उद्धृत करना चाहिए:

--exclude-dir='dir?'

आप घुंघराले ब्रेसिज़ और उद्धृत पैटर्न का उपयोग इस तरह से एक साथ कर सकते हैं:

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

एक पैटर्न कई पथ खंडों को फैला सकता है:

--exclude-dir='some*/?lse'

यह एक निर्देशिका को बाहर कर देगा topdir/something/else


13

अक्सर इसका उपयोग करें:

grepके साथ संयोजन के रूप में इस्तेमाल किया जा सकता है -r(पुनरावर्ती), i(मामले को नजरअंदाज) और -o(प्रिंट लाइनों का केवल मिलान भाग)। filesउपयोग को बाहर करने के लिए --excludeऔर निर्देशिका के उपयोग को बाहर करने के लिए --exclude-dir

इसे एक साथ रखकर आप कुछ इस तरह से समाप्त करते हैं:

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

इसका वर्णन करने से यह वास्तव में की तुलना में कहीं अधिक जटिल लगता है। सरल उदाहरण के साथ वर्णन करना आसान है।

उदाहरण:

मान लीजिए कि मैं उन सभी स्थानों के लिए वर्तमान परियोजना की खोज कर रहा हूं जहां मैंने debuggerडिबगिंग सत्र के दौरान स्ट्रिंग मान को स्पष्ट रूप से सेट किया है , और अब समीक्षा / हटाने की इच्छा है।

मैं एक स्क्रिप्ट लिखता हूं जिसे findDebugger.shइस्तेमाल किया जाता हैgrep सभी घटनाओं को खोजने के लिए । तथापि:

फ़ाइल बहिष्करण के लिए - मैं यह सुनिश्चित करना चाहता हूं कि .eslintrcइसे नजरअंदाज कर दिया गया है (यह वास्तव में एक अस्तर नियम है, debuggerइसलिए इसे बाहर रखा जाना चाहिए)। इसी तरह, मैं नहीं चाहता कि मेरी स्क्रिप्ट किसी भी परिणाम में संदर्भित हो।

निर्देशिका बहिष्करण के लिए - मैं बाहर करना चाहता हूं node_modulesक्योंकि इसमें बहुत सारे पुस्तकालय हैं जो संदर्भ करते हैं debuggerऔर मुझे उन परिणामों में कोई दिलचस्पी नहीं है। इसके अलावा मैं बस छोड़ इच्छा .ideaऔर .gitक्योंकि मैं उन खोज स्थानों के बारे में या तो कोई परवाह नहीं है, और इच्छा खोज performant रखने के लिए छिपा हुआ निर्देशिका।

तो यहाँ परिणाम है - मैं एक स्क्रिप्ट बनाने के findDebugger.shसाथ बुलाया :

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

मेरा मानना ​​है कि "आर" विकल्प को ऊपरी मामले "-आर" के साथ मुद्रित किया जाना चाहिए।
सींगेटबज

1
दिलचस्प। "आर" ने हमेशा मेरे लिए निक्स और मैक पर काम किया है।
आर्केल्डन

जब मैंने अपना उत्तर लिखा , तो मैंने इस्तेमाल किया -R(मुझे अब याद नहीं है)। मैं आमतौर पर उपयोग करता हूं -r। यह पता चला है कि अपरकेस संस्करण सिमलिंक का अनुसरण करता है । टीआईएल।
जॉन्सवेब

@ जॉनसीवेब - धन्यवाद। आपके उत्तर का
उत्थान किया

10

आप कुछ इस तरह की कोशिश कर सकते हैं grep -R search . | grep -v '^node_modules/.*'


34
कुछ मामलों में ऐसा अच्छा समाधान नहीं है। उदाहरण के लिए: यदि 'node_modules' निर्देशिका बहुत सारे झूठे सकारात्मक मिलानों के साथ एक विशाल है (इसलिए निर्देशिका को फ़िल्टर करने की आवश्यकता है) तो पहला grep एक उप-निर्देशिका के माध्यम से खोज करने में बहुत समय बर्बाद कर रहा है और दूसरा संक्षिप्त फ़िल्टरिंग मैचों से बाहर। यह पहले grep में node_modules को बाहर करने के लिए तेज़ है।
गुरूवार


1
गुरु की टिप्पणी के लिए डिट्टो मेरे मामले में /varहिट होने पर फांसी का फंदा /var/run। इसलिए मैं पहली जगह में निर्देशिका से बचना चाहता हूं।
jww

3
--exclude-dir2016 के रूप में सबसे अच्छा समाधान है।
उमर तारिक

10

यदि आप एक Git भंडार में कोड के लिए grepping और रहे हैं, तो node_modulesअपने में है .gitignore, तो आप उपयोग कर सकते हैं git grepgit grepकाम के पेड़ में ट्रैक की गई फ़ाइलों को खोजता है, सब कुछ से अनदेखा करता है.gitignore

git grep "STUFF"

यह बहुत उपयोगी टिप है। धन्यवाद।
NKM

4

, बहुत उपयोगी विशेष रूप से उन लोगों के साथ निपटने के लिए Node.js जहाँ हम खोज अंदर "node_modules" से बचना चाहते हैं:

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

2

एक साधारण कार्य कमान:

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

ऊपर मैं वर्तमान निर्देशिका "dspace" में पाठ "creativecommons.org" के लिए grep करता हूं और dirs {लॉग, एसेटस्टोर} को बाहर करता हूं।

किया हुआ।


कोष्ठक में कई निर्देशिकाओं सहित, नीट
Mijo

2

कई सही उत्तर यहां दिए गए हैं, लेकिन मैं इसे एक बिंदु पर जोर देने के लिए जोड़ रहा हूं जिसके कारण कुछ असफल प्रयास पहले विफल हो गए: exclude-dirएक पैटर्न लेता है , एक निर्देशिका का मार्ग नहीं।

अपनी खोज कहें:

grep -r myobject

और आप नोटिस करते हैं कि आपका आउटपुट परिणाम के साथ बरबाद है src/other/objects-folder। यह आदेश आपको इच्छित परिणाम नहीं देगा:

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

और आपको आश्चर्य हो सकता है कि exclude-dirकाम क्यों नहीं हो रहा है! वास्तव में परिणामों को बाहर करने के लिए objects-folder, बस यह करें:

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

दूसरे शब्दों में, केवल फ़ोल्डर नाम का उपयोग करें , पथ का नहीं। एक बार जब आप इसे जान लेते हैं

आदमी पृष्ठ से:

--exclude-dir = GLOB
किसी भी कमांड-लाइन डायरेक्टरी को एक नाम प्रत्यय के साथ छोड़ें जो पैटर्न GLOB से मेल खाती है। पुनरावर्ती खोज करते समय, किसी भी उपनिर्देशिका को छोड़ दें जिसका आधार नाम GLOB से मेल खाता है। GLOB में किसी भी बेमानी अनुगामी स्लैश को अनदेखा करें।


2

यह एक मेरे लिए काम करता है:

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

5
यह उत्तर पहले से पोस्ट किए गए से अलग कैसे है?
aexl


-1

"Grep -v" का उपयोग करके अपने परिणामों को फ़िल्टर करने का एक सरल तरीका होगा।

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


12
यह प्रभावी रूप से एक ही जवाब है डुप्स्विच 3 साल पहले प्रदान किया गया था। इसकी भी यही समस्या है।
jww
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.