मैं कैसे पुनरावृत्ति करूँ?


1682

मैं grepसभी निर्देशिकाओं और उपनिर्देशिकाओं की पुनरावृत्ति कैसे करूं ?

find . | xargs grep "texthere" *

110
@ TC1 दुःख की बात यह है कि grep स्वयं इस प्रश्न का उत्तर दे सकता है (कम से कम GNU grep): grep --help | grep पुनरावर्ती
फ्रैंक श्मिट

7
यदि आप पुनरावर्ती खोजों को करने के लिए अपने आप को बार-बार grep का उपयोग करते हुए पाते हैं (विशेषकर यदि आप मैन्युअल रूप से बहुत अधिक फ़ाइल / निर्देशिका बहिष्करण करते हैं), तो आपको ack (एक बहुत ही प्रोग्रामर-अनुकूल grep विकल्प) उपयोगी मिल सकता है।
निक मैकुडी

19
वास्तव में न तो -आर और न ही - सोलारिस बॉक्स पर काम पर मैं काम में उपयोग करता हूं। और grep के लिए मैन पेज कुछ भी पुनरावर्ती का उल्लेख नहीं करता है। मुझे खुद को खोजने और एक्सरजेस का सहारा लेना पड़ा।
बेन

8
अब यह करने के लिए मेरा पसंदीदा तरीका है github.com/ggreer/the_silver_searcher
dranxo

1
grep -rin xlsx *.plरेडहैट लिनक्स पर मेरे लिए काम नहीं करता है। मुझे "कोई मैच नहीं" त्रुटि मिलती है।
सरकंडा

जवाबों:


2507
grep -r "texthere" .

पहला पैरामीटर खोज करने के लिए नियमित अभिव्यक्ति का प्रतिनिधित्व करता है, जबकि दूसरा उस निर्देशिका का प्रतिनिधित्व करता है जिसे खोजा जाना चाहिए। इस मामले में, .वर्तमान निर्देशिका का मतलब है।

नोट: यह GNU grep के लिए काम करता है, और कुछ प्लेटफॉर्म जैसे Solaris पर आपको विशेष रूप से GNU grep का उपयोग करना चाहिए, जो कि कानूनी तौर पर लागू करने के विरोध में है। सोलारिस के लिए यह ggrepकमांड है।


39
नोट: "grep -r" केवल नए greps पर काम करता है। यह grep पर काम नहीं करता है जो AIX 5.3उदाहरण के लिए आता है ।
रोक

110
सहानुभूति का पालन करने के लिए grep -R का उपयोग करें।
एलॉफ़

53
यह जानना अच्छा है कि "-i" यह मामले को असंवेदनशील बना देगा, और "-n" में प्रत्येक मिलान परिणाम के लिए लाइन नंबर भी शामिल है।
साडेग

24
यह जानने के लिए भी अच्छा है, यदि आप एक निश्चित स्ट्रिंग की तलाश कर रहे हैं और रेगेक्स का उपयोग नहीं कर रहे हैं, तो -F विकल्प का उपयोग करें। यह रेगेक्स पार्सर को न लगाकर आपको समय की कमी से बचाएगा। बहुत आसान है अगर आप बहुत सारी फाइलें खोज रहे हैं।
जेफ

6
alias rgrep = 'grep -r'
totten

679

यदि आप उस फ़ाइल के विस्तार या पैटर्न को जानते हैं जो आप चाहते हैं, तो --includeविकल्प का उपयोग करने के लिए एक और तरीका है :

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

आप के साथ बाहर करने के लिए फ़ाइलों का भी उल्लेख कर सकते हैं --exclude

एजी

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


3
Grep के साथ बढ़िया काम करता है जो Linux और Cygwin के साथ आता है, लेकिन AIX के साथ आने वाले के साथ नहीं।
रोक

1
@KrzysztofWolny: =उबंटू पर ठीक काम करता है। पुनश्च: यह एक पीछे की जगह माना जाता है, लेकिन एसओ मार्कडाउन पार्सर विफल रहा।
डैन डैस्कलेस्क्यू

4
@DanDascalescu मैंने अप के लिए अप्रोच किया grep, एग के लिए नहीं, बस आप जानते हैं :)
बर्नहार्ड

1
क्या हमारे पास पुनरावर्ती खोज करते हुए निर्देशिका को बाहर करने का विकल्प है?
टॉम टेलर

विंडोज साइबरविन को डबल-कोट्स पसंद हैं--include "*.txt" --include "*.TXT"
बॉब स्टेन

127

इसके अलावा:

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

लेकिन grep -rएक बेहतर जवाब है।


14
या यदि आप फ़ाइल नाम में रिक्त स्थान के बारे में चिंता नहीं करना चाहते हैं तो find . -type f -exec grep "foo" '{}' \;अच्छी तरह से काम करता है जहां समर्थित है।
एड्ड स्टील

4
अगर आप xargs से grep तक पाइप ढूंढने जा रहे हैं, और यदि आप केवल एक निश्चित स्ट्रिंग की खोज कर रहे हैं (यानी, regex नहीं), तो आपको grep -F विकल्प को लागू करने से फायदा हो सकता है, इसलिए grep regex इंजन को लोड नहीं करेगा प्रत्येक आह्वान के लिए। यदि बहुत सारी फाइलें हैं तो यह बहुत तेज होगी।
जेफ

2
खोजो। -Type f -exec grep -Hu "foo" {}}; मैं इसका उपयोग फ़ाइल नाम देता है।
वेस

यह सभी * nix पर काम करता है क्योंकि यह POSIX 7 है
Ciro Santilli 病毒 n n n

1
find ./ -type f -print0 | xargs -0 grep "foo"
अनहेल्के

118

मैं अब हमेशा उपयोग करता हूं (यहां तक ​​कि विंडोज पर भी GoW के साथ - विंडोज पर Gnu ):

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

इसमें निम्नलिखित विकल्प शामिल हैं:

--include=PATTERN

निर्देशिकाओं में पुनर्खरीद केवल फ़ाइल मिलान खोज रहा है PATTERN

-n, --line-number

इसके इनपुट फ़ाइल के भीतर लाइन नंबर के साथ आउटपुट की प्रत्येक पंक्ति को उपसर्ग करें।

(नोट: phuclv कहते हैं टिप्पणी में है कि -nप्रदर्शन एक बहुत कम हो जाती है तो , तो आप उस विकल्प को छोड़ने के लिए चाहते हो सकता है)

-R, -r, --recursive

प्रत्येक निर्देशिका के तहत सभी फाइलें पढ़ें, पुनरावर्ती; यह -d recurseविकल्प के बराबर है ।

-H, --with-filename

प्रत्येक मैच के लिए फ़ाइल नाम प्रिंट करें।

-I     

एक बाइनरी फ़ाइल को संसाधित करें जैसे कि इसमें मिलान डेटा शामिल नहीं था;
यह --binary-files=without-matchविकल्प के बराबर है ।

और अगर मैं केस-असंवेदनशील परिणाम चाहता हूं, तो मैं ' i' ( -nRHIi) जोड़ सकता हूं।

मैं प्राप्त कर सकता हूं:

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

Gow आशाजनक लग रहा है - GNU विंडोज उपयोगिताओं की तुलना में नया जो मैं उपयोग कर रहा हूँ। इसे अभी
आज़माएं

यहाँ अंतिम चरित्र * का अर्थ क्या है?
लोर्निपर

2
@lorniper यह शेल को आपकी वर्तमान निर्देशिका में सभी फ़ाइलों और फ़ोल्डरों का चयन करने के लिए बनाता है, जिससे फ़ोल्डरों में grep लागू होता है और -Rफ़ोल्डरों के लिए ( विकल्प के कारण पुनरावर्ती )।
VonC

2
@lorniper Noy बिल्कुल: *या .एक ग्लोब पैटर्न (शेल द्वारा व्याख्यायित): unix.stackexchange.com/a/64695/7490 है । ' .' डॉटफाइल्स या डॉट फोल्डर का चयन करेगा (जैसे .git/)
VonC

पहले मैंने हमेशा उपयोग किया है, grep -rnIलेकिन फिर मैंने सीखा कि -nप्रदर्शन बहुत कम हो जाता है इसलिए मैं इसका उपयोग तब करता हूं जब वास्तव में जरूरत होती है और सामान्य रूप से मैं उपयोग -rI
करूंगा

25

POSIX सिस्टम में, आप के लिए -rपैरामीटर नहीं मिलता है grepऔर आपकी grep -rn "stuff" .नहीं चलेगी, लेकिन यदि आप findकमांड का उपयोग करते हैं तो यह होगा:

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

द्वारा सहमत Solarisऔर HP-UX


का अर्थ क्या है {} \; क्रमशः छापें?
user1169587

3
में -execविकल्प - प्रतीक {}फ़ाइल नाम वर्तमान द्वारा पाया जो लिए एक संदर्भ है findउपकरण (फ़ाइल नाम हमने पाया के साथ कुछ करने के लिए है कि), यह भी -execविकल्प के साथ समाप्त किया जाना चाहिए ;प्रतीक (कार्यकारी आदेशों की न खत्म होने वाली मार्क करने के लिए), लेकिन यह सब है, क्योंकि एक शेल में चल रहा है जो प्रतीक से बच जाना चाहिए .. और अंत में -printविकल्प findस्क्रीन पर पाए गए फ़ाइल नाम को प्रिंट करने के लिए टूल देता है ।
रूक

19

ग्लोबिंग **

grep -rकार्यों का उपयोग करना , लेकिन यह ओवरकिल हो सकता है, विशेष रूप से बड़े फ़ोल्डरों में।

अधिक व्यावहारिक उपयोग के लिए, यहाँ सिंटैक्स है जो ग्लोबिंग सिंटैक्स का उपयोग करता है ( **):

grep "texthere" **/*.txt

जो केवल चयनित पैटर्न के साथ विशिष्ट फ़ाइलों को पकड़ता है। यह समर्थित गोले जैसे बैश +4 या zsh के लिए काम करता है ।

इस सुविधा को सक्रिय करने के लिए, चलाएँ shopt -s globstar:।

यह भी देखें: मुझे लिनक्स पर विशिष्ट पाठ वाली सभी फाइलें कैसे मिलेंगी?

git grep

Git संस्करण नियंत्रण के तहत परियोजनाओं के लिए, उपयोग करें:

git grep "pattern"

जो बहुत जल्दी है।

ripgrep

बड़े प्रोजेक्ट्स के लिए, ripgrepक्विकेस्ट ग्रेपिंग टूल वह है जो जीआरपीएस फाइल को डिफॉल्ट रूप से रिकार्सेबल करता है :

rg "pattern" .

यह रस्ट के रेगेक्स इंजन के शीर्ष पर बनाया गया है जो बहुत तेजी से खोज करने के लिए परिमित ऑटोमेटा, SIMD और आक्रामक शाब्दिक अनुकूलन का उपयोग करता है। चेक यहाँ विस्तृत विश्लेषण


3
Git grep सुझाव के लिए धन्यवाद - यह बहुत उपयोगी है और मुझे इसके बारे में पता नहीं था!
बस्या

2
रिपग्रेप सुझाव के लिए धन्यवाद। यह तेजी से रास्ता है।
क्या कूल होगा

11

के नाम जानने के लिए filesसाथ pathरिकर्सिवली विशेष युक्त stringके लिए आदेश नीचे उपयोग UNIX:

find . | xargs grep "searched-string"

के लिए Linux:

grep -r "searched-string" .

UNIXसर्वर पर एक फ़ाइल खोजें

find . -type f -name file_name

LINUX सर्वर पर एक फ़ाइल खोजें

find . -name file_name

11

सिर्फ फ़ाइल नाम भी उपयोगी हो सकते हैं

grep -r -l "foo" .

10

यदि आप केवल वास्तविक निर्देशिकाओं का पालन करना चाहते हैं, और प्रतीकात्मक लिंक नहीं,

grep -r "thingToBeFound" directory

यदि आप प्रतीकात्मक लिंक के साथ-साथ वास्तविक निर्देशिकाओं का पालन करना चाहते हैं (अनंत पुनरावृत्ति से सावधान रहें),

grep -R "thing to be found" directory

चूंकि आप पुनरावर्ती रूप से प्राप्त करने का प्रयास कर रहे हैं, इसलिए निम्न विकल्प भी आपके लिए उपयोगी हो सकते हैं:

-H: outputs the filename with the line

-n: outputs the line number in the file

इसलिए यदि आप मौजूदा निर्देशिका या किसी भी उपनिर्देशिका में डार्थ वाडर वाली सभी फाइलों को ढूंढना चाहते हैं और फ़ाइल नाम और लाइन नंबर को कैप्चर करना चाहते हैं, लेकिन प्रतीकात्मक लिंक का पालन करने के लिए पुनरावृत्ति नहीं चाहते हैं, तो कमांड होगा

grep -rnH "Darth Vader" .

यदि आप निर्देशिका में शब्द बिल्ली के सभी उल्लेख ढूंढना चाहते हैं

/home/adam/Desktop/TomAndJerry 

और आप इस समय निर्देशिका में हैं

/home/adam/Desktop/WorldDominationPlot

और आप फ़ाइल नाम को कैप्चर करना चाहते हैं, लेकिन स्ट्रिंग "कैट" के किसी भी उदाहरण की पंक्ति संख्या नहीं, और आप चाहते हैं कि प्रतीकात्मक लिंक का पालन करें यदि यह उन्हें मिल जाए, तो आप निम्न में से कोई भी चला सकते हैं

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

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

स्रोत:

"grep --help" चला रहा है

प्रतीकात्मक कड़ियों का संक्षिप्त परिचय, इस उत्तर को पढ़ने वाले किसी व्यक्ति के लिए और उनके संदर्भ में मेरे द्वारा उलझन में: https://www.nixtutor.com/freebsd/understanding-symbolic-links/


बहुत बढ़िया जवाब। अतिरिक्त स्विच (-rnh) बहुत मददगार हैं, इसलिए उन्हें सुझाव देने के लिए धन्यवाद।
सेमीटेक्स 41

8

अब यह करने के लिए मेरा पसंदीदा तरीका है github.com/ggreer/the_silver_searcher । यह मूल रूप से एकेक जैसी ही है, लेकिन कुछ और अनुकूलन के साथ।

यहाँ एक छोटा बेंचमार्क है। मैं प्रत्येक परीक्षण से पहले कैश को साफ करता हूं (cf /ubuntu/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


6

यदि आप निर्देशिका संरचना से सभी फ़ाइलों में एक विशिष्ट सामग्री की तलाश कर रहे हैं, तो आप इसका उपयोग कर सकते हैं findक्योंकि यह अधिक स्पष्ट है कि आप क्या कर रहे हैं:

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

ध्यान दें कि -l(L का डाउनकेस) उस फ़ाइल का नाम दिखाता है जिसमें टेक्स्ट होता है। इसे हटा दें यदि आप इसके बजाय मैच को स्वयं प्रिंट करना चाहते हैं। या -Hमैच के साथ फाइल प्राप्त करने के लिए उपयोग करें। सभी एक साथ, अन्य विकल्प हैं:

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

जहां -nलाइन नंबर प्रिंट होता है।


2
केवल होने के लिए अप-मतदान findके दोनों से बचने के अनावश्यक उपयोग का हल xargsहै और उपयोग +करने के बजाय \;साथ -execहै, जिससे अनावश्यक प्रक्रिया की शुरूआत की टन से परहेज। :-)
शैडो रेंजर

6

यह वह है जो मेरे केस के लिए मेरे वर्तमान मशीन पर काम करता है (विंडोज़ 7 पर गिट बश):

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

मैं हमेशा अंतरिक्ष के साथ रास्तों के लिए -0 और -0 भूल जाता हूं।

संपादित करें: मेरा पसंदीदा उपकरण अब रिपग्रेप के बजाय है: https://github.com/BurntSushi/ripgrep-releases । यह वास्तव में तेज़ है और इसमें बेहतर चूक हैं (जैसे डिफ़ॉल्ट रूप से पुनरावर्ती)। मेरे मूल उत्तर के रूप में एक ही उदाहरण लेकिन रिपग्रेप का उपयोग करके:rg -g "*.cs" "content pattern"


4

grep -r "texthere" . (नोटिस अवधि अंत में)

(^ क्रेडिट: https://stackoverflow.com/a/1987928/1438029 )


स्पष्टीकरण:

grep -r "texthere" /( सभी निर्देशिकाओं और उपनिर्देशिकाओं को पुन: प्राप्त करें )

grep -r "texthere" .( इन निर्देशिकाओं और उपनिर्देशिकाओं को पुन: प्राप्त करें )

grep पुनरावर्ती

grep [options] PATTERN [FILE...]

[विकल्प]

-R, -r, --recursive

प्रत्येक निर्देशिका के अंतर्गत, पुनरावर्ती रूप से सभी फाइलें पढ़ें।

यह -d recurseया --directories=recurseविकल्प के बराबर है ।

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

grep मदद

$ grep --help

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

वैकल्पिक

ack( http://beyondgrep.com/ )

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


4

2018 में, आप उपयोग करना चाहते हैं ripgrepया the-silver-searcherक्योंकि वे विकल्पों की तुलना में तेज़ हैं।

यहां 336 प्रथम-स्तरीय उपनिर्देशिकाओं के साथ एक निर्देशिका है:

% 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, इस स्थापित करता है ripgrep: brew install ripgrep। यह स्थापित करता है silver-searcher: brew install the_silver_searcher


यदि आपको अक्सर ऐसा करने की आवश्यकता होती है, तो गति महत्वपूर्ण है, लेकिन हम में से अधिकांश खुद को केवल एक वर्ष में कुछ ही बार ऐसा कर पाते हैं। नवीनतम स्पिफी थर्ड-पार्टी जूजू टूल डु पत्रिकाओं को स्थापित करना ओवरकिल है और जो समाधान 1978 के बाद से बहुत अधिक नहीं बदले हैं, वे अच्छे से जानते हैं।
ट्रिपल जूल

मुझे यह अत्यधिक अनुमान लगता है कि एक प्रोग्रामर एक स्रोत के पेड़ में प्रति वर्ष केवल कई बार पाठ की खोज करेगा। लेकिन प्रयोज्य के दृष्टिकोण से भी, rgस्क्रैच से एक पुनरावर्ती grep कमांड को एक साथ मिलाने पर काफी बढ़त है। का उपयोग करते हुए rg: rg foo। यूनिक्स उपकरण का उपयोग करना find . | xargs grep foo:। और अगर आपकी किसी भी फाइल में एक उद्धरण है, तो आपको उपयोग करने की आवश्यकता है find . -print0 | xargs -0 grep foo। क्या आपको याद है कि अगर आप साल में कई बार इसका इस्तेमाल करते हैं?
हुग्डब्रोर्न

1
आप भूल रहे हैं find . -type f -exec grep 'regex' {} +जो वास्तव में याद रखना आसान है यदि आप इन उपकरणों का उपयोग किसी भी नियमितता के साथ करते हैं। लेकिन शायद आपको अपने स्रोत के पेड़ पर ctagsया etagsवैसे भी दौड़ना चाहिए, अगर आपको बार-बार सामान ढूंढने की आवश्यकता हो।
ट्रिपल

मैं ripgrep का उपयोग कर रहा हूं और यह बहुत अच्छा है। लेकिन प्रोग्रामर्स के लिए सिल्वर सर्चर शानदार है। +1
मैट

3

मेरे IBM AIX सर्वर (OS संस्करण: AIX 5.2) में, उपयोग करें:

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

यह फ़ाइल में पथ / फ़ाइल का नाम और संबंधित लाइन नंबर प्रिंट करेगा:

./inc/xxxx_x.h

2865: / ** विवरण: स्ट्रिंग

वैसे भी, यह मेरे लिए काम करता है:)


3

नीचे एक Stringपुनरावर्ती Unixऔर Linuxपर्यावरण खोज के लिए आदेश हैं।

के लिए UNIXआदेश है:

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

के लिए Linuxआदेश है:

grep -r "string to be searched" .

2

उपलब्ध झंडों की सूची के लिए:

grep --help 

वर्तमान निर्देशिका में regexp texthere के लिए सभी मेलों को संबंधित लाइन संख्या के साथ लौटाता है:

grep -rn "texthere" .

टैक्स्टेयर के लिए सभी मैच लौटाता है , जो रूट डायरेक्टरी पर शुरू होता है, इसी लाइन नंबर और अनदेखी मामले के साथ:

grep -rni "texthere" /

यहां इस्तेमाल किए गए झंडे:

  • -r पुनरावर्ती
  • -n आउटपुट के साथ प्रिंट लाइन नंबर
  • -i मामले की अनदेखी करें

1

मुझे लगता है कि यह वही है जो आप लिखने की कोशिश कर रहे हैं

grep myText $(find .)

और यह कुछ और उपयोगी हो सकता है यदि आप फ़ाइलों को हिट grep ढूंढना चाहते हैं

grep myText $(find .) | cut -d : -f 1 | sort | uniq

यह बहुत सहज है: उदाहरण के लिए: grep -i acc $ (ढूंढें। -नेमी "निष्पादन *। *।")
यू शेन

1

यहां मेरे दो सेंट फेंक रहे हैं। जैसा कि अन्य पहले ही बता चुके हैं कि grep -r हर प्लेटफॉर्म पर काम नहीं करता है। यह मूर्खतापूर्ण लग सकता है लेकिन मैं हमेशा गिट का उपयोग करता हूं।

git grep "texthere"

यहां तक ​​कि अगर निर्देशिका का मंचन नहीं किया जाता है, तो मैं इसे मंच देता हूं और git grep का उपयोग करता हूं।


0

ध्यान दें कि find . -type f | xargs grep whateverसमाधानों की संख्या "तर्क सूची में लंबे समय तक" त्रुटियों में चलेगी जब खोजने से बहुत अधिक फाइलें मेल खाती हैं।

सबसे अच्छा शर्त है, grep -rलेकिन अगर वह उपलब्ध नहीं है, तो find . -type f -exec grep -H whatever {} \;इसके बजाय का उपयोग करें ।


है ना? xargsविशेष रूप से "तर्क सूची बहुत लंबी" समस्या के लिए एक समाधान है।
त्रिपली

2
ठीक है, नहीं - xargs विशेष रूप से एक तर्क-वितर्क के पाइप को परिवर्तित करने के लिए है, लेकिन हाँ, यह सच है कि जब -s और / या -L के साथ प्रयोग किया जाता है, तो आधुनिक xargs कई मल्टीपल इनवोकेशन को तोड़कर बहुत लंबे arglists से निपट सकता है, लेकिन इसे डिफ़ॉल्ट रूप से कॉन्फ़िगर नहीं किया गया है (और उपरोक्त प्रतिक्रियाओं में से किसी में भी नहीं था)। एक उदाहरण के रूप में:find . -type f | xargs -L 100 grep whatever
m.thome

वह कौन सा मंच होगा? POSIXxargs को इस व्यवहार को बॉक्स से बाहर करने के लिए मानकीकृत किया गया है। " xargsउपयोगिता कमांड लाइन की लंबाई को सीमित करेगी, ताकि जब कमांड लाइन को जोड़ दिया जाए, तो संयुक्त तर्क और पर्यावरण सूची ... {ARG_MAX} -2048 बाइट्स से अधिक न हो।"
ट्रिपलए

हम्म। हालांकि इस आधार पर गोन डॉक्स पॉज़िक्स की तुलना में कम स्पष्ट हैं, और मेरे पास अब उस मशीन तक पहुंच नहीं है जिसके कारण मुझे यह कथन करना पड़ा है, मैं किसी भी मौजूदा कार्यान्वयन पर अपनी मूल व्याख्या की पुष्टि नहीं कर सकता। पुनरावर्ती grep, निश्चित रूप से, अभी भी उपलब्ध होने पर बेहतर है, लेकिन xargs नुस्खा से बचने के लिए बहुत कम कारण है (grep के लिए -H का उपयोग करें, क्योंकि grep के अंतिम आह्वान से बचने के लिए केवल एक फ़ाइल नाम पारित किया जा रहा है)।
m.thome

0

बस मज़े के लिए, * .txt फ़ाइलों की एक त्वरित और गंदी खोज अगर @christangrant उत्तर टाइप करने के लिए बहुत अधिक है :-)

grep -r texthere .|grep .txt


0

यहां एक पुनरावर्ती (बाश और श के साथ हल्के से परीक्षण किया गया) फ़ंक्शन है जो किसी दिए गए फ़ोल्डर ($ 1) के सभी सबफ़ोल्डर्स का पता लगाता है और grepदिए गए फ़ाइलों ($ 2) में दिए गए स्ट्रिंग ($ 3) के लिए खोजों का उपयोग कर रहा है :

$ 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"

इसे चलाना और एक उदाहरण आउटपुट:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename

-2
The syntax is:
cd /path/to/dir
grep -r <"serch_word name"> .

7
यह अन्य उत्तरों के लिए बहुत कुछ नहीं जोड़ता है
मेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.