मैं grep
सभी निर्देशिकाओं और उपनिर्देशिकाओं की पुनरावृत्ति कैसे करूं ?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
रेडहैट लिनक्स पर मेरे लिए काम नहीं करता है। मुझे "कोई मैच नहीं" त्रुटि मिलती है।
मैं grep
सभी निर्देशिकाओं और उपनिर्देशिकाओं की पुनरावृत्ति कैसे करूं ?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
रेडहैट लिनक्स पर मेरे लिए काम नहीं करता है। मुझे "कोई मैच नहीं" त्रुटि मिलती है।
जवाबों:
grep -r "texthere" .
पहला पैरामीटर खोज करने के लिए नियमित अभिव्यक्ति का प्रतिनिधित्व करता है, जबकि दूसरा उस निर्देशिका का प्रतिनिधित्व करता है जिसे खोजा जाना चाहिए। इस मामले में, .
वर्तमान निर्देशिका का मतलब है।
नोट: यह GNU grep के लिए काम करता है, और कुछ प्लेटफॉर्म जैसे Solaris पर आपको विशेष रूप से GNU grep का उपयोग करना चाहिए, जो कि कानूनी तौर पर लागू करने के विरोध में है। सोलारिस के लिए यह ggrep
कमांड है।
AIX 5.3
उदाहरण के लिए आता है ।
यदि आप उस फ़ाइल के विस्तार या पैटर्न को जानते हैं जो आप चाहते हैं, तो --include
विकल्प का उपयोग करने के लिए एक और तरीका है :
grep -r --include "*.txt" texthere .
आप के साथ बाहर करने के लिए फ़ाइलों का भी उल्लेख कर सकते हैं --exclude
।
यदि आप बार-बार कोड के माध्यम से खोज करते हैं, तो Ag (The Silver Searcher) grep के लिए एक अधिक तेज़ विकल्प है, जो खोज कोड के लिए अनुकूलित है। उदाहरण के लिए, यह डिफ़ॉल्ट रूप से पुनरावर्ती है और स्वचालित रूप से सूचीबद्ध फ़ाइलों और निर्देशिकाओं को अनदेखा करता है .gitignore
, इसलिए आपको grep या खोजने के लिए एक ही बोझिल बहिष्करण विकल्पों को पारित करने की आवश्यकता नहीं है।
=
उबंटू पर ठीक काम करता है। पुनश्च: यह एक पीछे की जगह माना जाता है, लेकिन एसओ मार्कडाउन पार्सर विफल रहा।
grep
, एग के लिए नहीं, बस आप जानते हैं :)
--include "*.txt" --include "*.TXT"
इसके अलावा:
find ./ -type f -print0 | xargs -0 grep "foo"
लेकिन grep -r
एक बेहतर जवाब है।
find . -type f -exec grep "foo" '{}' \;
अच्छी तरह से काम करता है जहां समर्थित है।
find ./ -type f -print0 | xargs -0 grep "foo"
मैं अब हमेशा उपयोग करता हूं (यहां तक कि विंडोज पर भी 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;
...
-R
फ़ोल्डरों के लिए ( विकल्प के कारण पुनरावर्ती )।
*
या .
एक ग्लोब पैटर्न (शेल द्वारा व्याख्यायित): unix.stackexchange.com/a/64695/7490 है । ' .
' डॉटफाइल्स या डॉट फोल्डर का चयन करेगा (जैसे .git/
)
grep -rnI
लेकिन फिर मैंने सीखा कि -n
प्रदर्शन बहुत कम हो जाता है इसलिए मैं इसका उपयोग तब करता हूं जब वास्तव में जरूरत होती है और सामान्य रूप से मैं उपयोग -rI
POSIX सिस्टम में, आप के लिए -r
पैरामीटर नहीं मिलता है grep
और आपकी grep -rn "stuff" .
नहीं चलेगी, लेकिन यदि आप find
कमांड का उपयोग करते हैं तो यह होगा:
find . -type f -exec grep -n "stuff" {} \; -print
द्वारा सहमत Solaris
और HP-UX
।
-exec
विकल्प - प्रतीक {}
फ़ाइल नाम वर्तमान द्वारा पाया जो लिए एक संदर्भ है find
उपकरण (फ़ाइल नाम हमने पाया के साथ कुछ करने के लिए है कि), यह भी -exec
विकल्प के साथ समाप्त किया जाना चाहिए ;
प्रतीक (कार्यकारी आदेशों की न खत्म होने वाली मार्क करने के लिए), लेकिन यह सब है, क्योंकि एक शेल में चल रहा है जो प्रतीक से बच जाना चाहिए .. और अंत में -print
विकल्प find
स्क्रीन पर पाए गए फ़ाइल नाम को प्रिंट करने के लिए टूल देता है ।
**
grep -r
कार्यों का उपयोग करना , लेकिन यह ओवरकिल हो सकता है, विशेष रूप से बड़े फ़ोल्डरों में।
अधिक व्यावहारिक उपयोग के लिए, यहाँ सिंटैक्स है जो ग्लोबिंग सिंटैक्स का उपयोग करता है ( **
):
grep "texthere" **/*.txt
जो केवल चयनित पैटर्न के साथ विशिष्ट फ़ाइलों को पकड़ता है। यह समर्थित गोले जैसे बैश +4 या zsh के लिए काम करता है ।
इस सुविधा को सक्रिय करने के लिए, चलाएँ shopt -s globstar
:।
यह भी देखें: मुझे लिनक्स पर विशिष्ट पाठ वाली सभी फाइलें कैसे मिलेंगी?
git grep
Git संस्करण नियंत्रण के तहत परियोजनाओं के लिए, उपयोग करें:
git grep "pattern"
जो बहुत जल्दी है।
ripgrep
बड़े प्रोजेक्ट्स के लिए, ripgrep
क्विकेस्ट ग्रेपिंग टूल वह है जो जीआरपीएस फाइल को डिफॉल्ट रूप से रिकार्सेबल करता है :
rg "pattern" .
यह रस्ट के रेगेक्स इंजन के शीर्ष पर बनाया गया है जो बहुत तेजी से खोज करने के लिए परिमित ऑटोमेटा, SIMD और आक्रामक शाब्दिक अनुकूलन का उपयोग करता है। चेक यहाँ विस्तृत विश्लेषण ।
के नाम जानने के लिए 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
यदि आप केवल वास्तविक निर्देशिकाओं का पालन करना चाहते हैं, और प्रतीकात्मक लिंक नहीं,
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/
अब यह करने के लिए मेरा पसंदीदा तरीका है 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
यह काम करना चाहिए:
grep -R "texthere" *
यदि आप निर्देशिका संरचना से सभी फ़ाइलों में एक विशिष्ट सामग्री की तलाश कर रहे हैं, तो आप इसका उपयोग कर सकते हैं find
क्योंकि यह अधिक स्पष्ट है कि आप क्या कर रहे हैं:
find -type f -exec grep -l "texthere" {} +
ध्यान दें कि -l
(L का डाउनकेस) उस फ़ाइल का नाम दिखाता है जिसमें टेक्स्ट होता है। इसे हटा दें यदि आप इसके बजाय मैच को स्वयं प्रिंट करना चाहते हैं। या -H
मैच के साथ फाइल प्राप्त करने के लिए उपयोग करें। सभी एक साथ, अन्य विकल्प हैं:
find -type f -exec grep -Hn "texthere" {} +
जहां -n
लाइन नंबर प्रिंट होता है।
find
के दोनों से बचने के अनावश्यक उपयोग का हल xargs
है और उपयोग +
करने के बजाय \;
साथ -exec
है, जिससे अनावश्यक प्रक्रिया की शुरूआत की टन से परहेज। :-)
यह वह है जो मेरे केस के लिए मेरे वर्तमान मशीन पर काम करता है (विंडोज़ 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"
grep -r "texthere" .
(नोटिस अवधि अंत में)
(^ क्रेडिट: https://stackoverflow.com/a/1987928/1438029 )
स्पष्टीकरण:
grep -r "texthere" /
( सभी निर्देशिकाओं और उपनिर्देशिकाओं को पुन: प्राप्त करें )
grep -r "texthere" .
( इन निर्देशिकाओं और उपनिर्देशिकाओं को पुन: प्राप्त करें )
grep [options] PATTERN [FILE...]
[विकल्प]
-R, -r, --recursive
प्रत्येक निर्देशिका के अंतर्गत, पुनरावर्ती रूप से सभी फाइलें पढ़ें।
यह
-d recurse
या--directories=recurse
विकल्प के बराबर है ।
$ grep --help
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
ack
( http://beyondgrep.com/ )
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
।
rg
स्क्रैच से एक पुनरावर्ती grep कमांड को एक साथ मिलाने पर काफी बढ़त है। का उपयोग करते हुए rg
: rg foo
। यूनिक्स उपकरण का उपयोग करना find . | xargs grep foo
:। और अगर आपकी किसी भी फाइल में एक उद्धरण है, तो आपको उपयोग करने की आवश्यकता है find . -print0 | xargs -0 grep foo
। क्या आपको याद है कि अगर आप साल में कई बार इसका इस्तेमाल करते हैं?
find . -type f -exec grep 'regex' {} +
जो वास्तव में याद रखना आसान है यदि आप इन उपकरणों का उपयोग किसी भी नियमितता के साथ करते हैं। लेकिन शायद आपको अपने स्रोत के पेड़ पर ctags
या etags
वैसे भी दौड़ना चाहिए, अगर आपको बार-बार सामान ढूंढने की आवश्यकता हो।
मेरे IBM AIX सर्वर (OS संस्करण: AIX 5.2) में, उपयोग करें:
find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \;
यह फ़ाइल में पथ / फ़ाइल का नाम और संबंधित लाइन नंबर प्रिंट करेगा:
./inc/xxxx_x.h
2865: / ** विवरण: स्ट्रिंग
वैसे भी, यह मेरे लिए काम करता है:)
नीचे एक String
पुनरावर्ती Unix
और Linux
पर्यावरण खोज के लिए आदेश हैं।
के लिए UNIX
आदेश है:
find . -name "string to be searched" -exec grep "text" "{}" \;
के लिए Linux
आदेश है:
grep -r "string to be searched" .
उपलब्ध झंडों की सूची के लिए:
grep --help
वर्तमान निर्देशिका में regexp texthere के लिए सभी मेलों को संबंधित लाइन संख्या के साथ लौटाता है:
grep -rn "texthere" .
टैक्स्टेयर के लिए सभी मैच लौटाता है , जो रूट डायरेक्टरी पर शुरू होता है, इसी लाइन नंबर और अनदेखी मामले के साथ:
grep -rni "texthere" /
यहां इस्तेमाल किए गए झंडे:
-r
पुनरावर्ती -n
आउटपुट के साथ प्रिंट लाइन नंबर -i
मामले की अनदेखी करेंमुझे लगता है कि यह वही है जो आप लिखने की कोशिश कर रहे हैं
grep myText $(find .)
और यह कुछ और उपयोगी हो सकता है यदि आप फ़ाइलों को हिट grep ढूंढना चाहते हैं
grep myText $(find .) | cut -d : -f 1 | sort | uniq
यहां मेरे दो सेंट फेंक रहे हैं। जैसा कि अन्य पहले ही बता चुके हैं कि grep -r हर प्लेटफॉर्म पर काम नहीं करता है। यह मूर्खतापूर्ण लग सकता है लेकिन मैं हमेशा गिट का उपयोग करता हूं।
git grep "texthere"
यहां तक कि अगर निर्देशिका का मंचन नहीं किया जाता है, तो मैं इसे मंच देता हूं और git grep का उपयोग करता हूं।
ध्यान दें कि find . -type f | xargs grep whatever
समाधानों की संख्या "तर्क सूची में लंबे समय तक" त्रुटियों में चलेगी जब खोजने से बहुत अधिक फाइलें मेल खाती हैं।
सबसे अच्छा शर्त है, grep -r
लेकिन अगर वह उपलब्ध नहीं है, तो find . -type f -exec grep -H whatever {} \;
इसके बजाय का उपयोग करें ।
xargs
विशेष रूप से "तर्क सूची बहुत लंबी" समस्या के लिए एक समाधान है।
find . -type f | xargs -L 100 grep whatever
xargs
को इस व्यवहार को बॉक्स से बाहर करने के लिए मानकीकृत किया गया है। " xargs
उपयोगिता कमांड लाइन की लंबाई को सीमित करेगी, ताकि जब कमांड लाइन को जोड़ दिया जाए, तो संयुक्त तर्क और पर्यावरण सूची ... {ARG_MAX} -2048 बाइट्स से अधिक न हो।"
बस मज़े के लिए, * .txt फ़ाइलों की एक त्वरित और गंदी खोज अगर @christangrant उत्तर टाइप करने के लिए बहुत अधिक है :-)
grep -r texthere .|grep .txt
यहां एक पुनरावर्ती (बाश और श के साथ हल्के से परीक्षण किया गया) फ़ंक्शन है जो किसी दिए गए फ़ोल्डर ($ 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