unix - मैं recursively grep कैसे करूँ?




(16)

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

find . | xargs grep "texthere" *

ग्लोबिंग **

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

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

grep "texthere" **/*.txt

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

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

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

git grep

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

git grep "pattern"

जो बहुत तेज़ है।

ripgrep

बड़ी परियोजनाओं के लिए, सबसे तेज़ grepping उपकरण ripgrep जो डिफ़ॉल्ट रूप से फ़ाइलों को रिकर्सिव रूप से greps:

rg "pattern" .

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


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

ओएसएक्स पर, यह ripgrep इंस्टॉल करता है: brew install ripgrep । यह silver-searcher स्थापित करता है: brew install the_silver_searcher


अब मैं हमेशा उपयोग करता हूं (विंडोज़ पर भी गोवा - विंडोज़ पर जीएनयू ):

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

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

--include=PATTERN

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

-n, --line-number

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

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

इसके अलावा:

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

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


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

यहां एक छोटा बेंचमार्क है। मैं प्रत्येक परीक्षण से पहले कैश साफ़ करता हूं (सीएफ https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache )

[email protected]$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
[email protected]:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
[email protected]$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
[email protected]$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s

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

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


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

grep -r texthere .|grep .txt


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

grep myText $(find .)

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

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

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

grep -r "thingToBeFound" directory

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

grep -R "thing to be found" directory

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

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


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

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

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

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

जहां -n संख्या रेखा मुद्रित करता है।


यह काम करना चाहिए:

grep -R "texthere" *

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

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

मैं हमेशा रिक्त स्थान के साथ पथ के लिए -प्रिंट 0 और -0 भूल जाता हूं।

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


या एके इंस्टॉल करें, अगर आप बहुत तेज तरीके से चाहते हैं और यह बहुत कुछ कर रहे हैं।


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

UNIX कमांड के लिए है:

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

Linux कमांड के लिए है:

grep -r "string to be searched" .

path साथ files नाम खोजने के लिए UNIX लिए नीचे दिए गए कमांड का विशेष string उपयोग शामिल है:

find . | xargs grep "searched-string"

Linux :

grep -r "searched-string" .

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

find . -type f -name file_name

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

find . -name file_name

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






grep