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


5254

मैं पाठ की एक विशिष्ट स्ट्रिंग वाली सभी फ़ाइलों के लिए अपने संपूर्ण लिनक्स सिस्टम को स्कैन करने का एक तरीका खोजने की कोशिश कर रहा हूं। बस स्पष्ट करने के लिए, मैं फ़ाइल के भीतर पाठ की तलाश कर रहा हूं, फ़ाइल नाम में नहीं।

जब मैं देख रहा था कि यह कैसे करना है, तो मैं इस समाधान में दो बार आया:

find / -type f -exec grep -H 'text-to-find-here' {} \;

हालाँकि, यह काम नहीं करता है। यह सिस्टम की हर एक फाइल को प्रदर्शित करता है।

क्या यह इसे करने के उचित तरीके के करीब है? यदि नहीं, तो मुझे कैसे करना चाहिए? फ़ाइलों में टेक्स्ट स्ट्रिंग्स को खोजने की यह क्षमता मेरे द्वारा किए जा रहे कुछ प्रोग्रामिंग प्रोजेक्ट्स के लिए असाधारण रूप से उपयोगी होगी।


21
याद रखें कि grep .दूसरों के बीच किसी एकल-वर्ण वाइल्डकार्ड के रूप में व्याख्या करेगा । मेरी सलाह है कि fgrep या egrep का उपयोग करें।
वाल्टर ट्रॉस

10
वैसे भी, आप लगभग वहाँ थे! बस के -Hसाथ बदलें -l(और शायद grepसाथ fgrep)। नामों के कुछ पैटर्न के साथ फ़ाइलों को बाहर करने के लिए आप findअधिक उन्नत तरीके से उपयोग करेंगे । यह उपयोग करने के लिए सीखने लायक है find, हालांकि। बस man find
वाल्टर ट्रॉस

6
find … -exec <cmd> +टाइप करना आसान है और तुलना में तेज है find … -exec <cmd> \;। यह तभी काम करता है, जब <cmd>किसी भी संख्या के नाम के तर्कों को स्वीकार किया जाए। निष्पादन समय में बचत विशेष रूप से बड़ी है यदि <cmd>पायथन या रूबी लिपियों की तरह शुरू करना धीमा है।
हगेलो

दिए गए मार्ग में गैर-पुनरावर्ती रूप से खोज करने के लिए कमांड `grep --include = *। Txt -snw" पैटर्न "thepath / * है।
स्टीफन लॉरेंट

@ StéphaneLaurent मुझे लगता है कि आप इसे बहुत जटिल कर रहे हैं। बस कहते हैंgrep "pattern" path/*.txt
फेडोरक्वी 'एसओ

जवाबों:


9504

निम्न कार्य करें:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -rया -Rपुनरावर्ती है,
  • -n लाइन नंबर है, और
  • -w पूरे शब्द से मेल खाता है।
  • -l (लोअर-केस L) को केवल मेल खाने वाली फाइल का नाम देने के लिए जोड़ा जा सकता है।

इन के साथ साथ, --exclude, --include, --exclude-dirझंडे कुशल खोज के लिए इस्तेमाल किया जा सकता:

  • यह केवल उन फ़ाइलों के माध्यम से खोज करेगा जिनके पास .c या .h एक्सटेंशन हैं:

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • यह .o एक्सटेंशन के साथ समाप्त होने वाली सभी फ़ाइलों की खोज को बाहर करेगा:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • निर्देशिकाओं के लिए --exclude-dirपैरामीटर के माध्यम से किसी विशेष निर्देशिका (ies) को बाहर करना संभव है । उदाहरण के लिए, यह dir1 /, dir2 / और उनमें से सभी मिलान * .dst / को बाहर कर देगा।

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

यह मेरे लिए बहुत अच्छी तरह से काम करता है, आपके जैसे लगभग एक ही उद्देश्य को प्राप्त करने के लिए।

अधिक विकल्पों के लिए जाँच करें man grep


74
उपयोग --exclude। जैसे "grep -rnw --exclude = *। o 'डाइरेक्टरी' -ई" पैटर्न "
rakib_

98
यह ध्यान देने योग्य है: ऐसा लगता है कि rविकल्प आलसी है (गहराई से पहले-पहले निर्देशिका के बाद स्टॉपर्स की तुलना में), जबकि Rलालची है (पूरे पेड़ को सही ढंग से पार कर जाएगा)।
एलिरन मलका

5
grep -rnw "स्ट्रिंग मैं देख रहा था" वह किया जो मुझे चाहिए था। धन्यवाद!
विलिअस

33
नोट (विशेषकर newbies के लिए): उपरोक्त कमांड में उद्धरण चिह्न महत्वपूर्ण हैं।
MadD7

69
@ एलिरन मलका Rएन rदोनों ही सही ढंग से निर्देशिकाओं को पार Rकरेंगे , लेकिन प्रतीकात्मक लिंक का अनुसरण करेंगे।
बेज़मैन

1495

आप उपयोग कर सकते हैं grep -ilR:

grep -Ril "text-to-find-here" /
  • i अनदेखी के मामले के लिए खड़ा है (आपके मामले में वैकल्पिक)।
  • R पुनरावर्ती के लिए खड़ा है।
  • l "फ़ाइल नाम दिखाने के लिए खड़ा है, परिणाम स्वयं नहीं"।
  • / अपनी मशीन के मूल में शुरू करने के लिए खड़ा है।

85
मेरे अनुभव के आधार पर, -iयह बहुत धीमा कर देता है, इसलिए यदि आवश्यक न हो तो इसका उपयोग न करें। एक निश्चित अवधि में इसका परीक्षण करें और फिर सामान्यीकरण करें। इसे कुछ मिनटों के भीतर पूरा किया जाना चाहिए। मुझे लगता है कि एक नियमित अभिव्यक्ति इसे धीमा कर देगी। लेकिन मेरी टिप्पणियाँ सपोसिशन पर आधारित हैं, मैं आपको timeलाइन के सामने इसका परीक्षण करने का सुझाव देता हूं ।
फेडोरक्वी 'एसओ ने or

4
हां, उसके लिए /*खड़ा है। वैसे भी मैंने अभी-अभी इसका परीक्षण किया और देखा कि सिर्फ /काम करता है।
फेडोरक्वी 'एसओ

10
यदि आप एक रेगेक्स का उपयोग करके नहीं खोज रहे हैं, तो आप अधिकांश सिस्टम पर grep के स्थान पर fgrep का उपयोग कर सकते हैं।
markle976

8
हाँ @ markle976, वास्तव में मैन grep से fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings:।
फेडोरक्वी 'एसओ ने'

17
आप निर्देशिका grep -Ril "text-to-find-here" ~/sites/या उपयोग के लिए पथ के साथ / बदल सकते हैं। वर्तमान निर्देशिका के लिएgrep -Ril "text-to-find-here" .
ब्लैक

329

आप एकेक का उपयोग कर सकते हैं । यह सोर्स कोड के लिए grep की तरह है । आप अपने पूरे फाइल सिस्टम को इसके साथ स्कैन कर सकते हैं।

बस करो:

ack 'text-to-find-here'

अपने मूल निर्देशिका में।

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


अपडेट करें

मैंने अभी द सिल्वर सर्चर की खोज की है , जो कि ऐक की तरह है लेकिन उससे 3-5 गुना तेज है और यहां तक ​​कि एक .gitignoreफाइल से पैटर्न को नजरअंदाज करता है ।


57
बहुत उपयोगी, सरल और तेज। चेतावनी: "डेबियन-व्युत्पन्न डिस्ट्रोस पर," ack-grep "के रूप में ack को पैक किया जाता है क्योंकि" ack "पहले से ही अस्तित्व में है" ( उससे परे )। आप अंत में उन
लिनक्सों

11
ack या ack-grep में अच्छी हाइलाइट्स होती हैं, लेकिन पाते हैं + grep जब उचित इस्तेमाल किया जाता है, तो प्रदर्शन में बहुत बेहतर होता है
स्लावोमिर लेनार्ट

14
ध्यान दें कि रिपग्रेप यहां बताई गई किसी भी चीज से तेज है, जिसमें द सिल्वर सर्चर और प्लेन 'ओल ग्रेप' शामिल हैं। प्रमाण के लिए इस ब्लॉग पोस्ट को देखें ।
रेडॉन रोसबोरो

194

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

grep -r "string to be searched"  /path/to/dir

rके लिए पुनरावर्ती और इतने पथ निर्दिष्ट में अपने उप-निर्देशिका खोज और भी होगा खड़ा है। यह आपको फ़ाइल नाम के साथ-साथ उस फ़ाइल में लाइन का प्रिंट आउट देगा जहाँ स्ट्रिंग दिखाई देती है।

या सभी जावास्क्रिप्ट फ़ाइलों (* .js) में खोजने के लिए आप जो प्रयास कर रहे हैं (उदाहरण:) के समान एक कमांड।

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

यह उन फ़ाइलों में पंक्तियों को प्रिंट करेगा जहां पाठ दिखाई देता है, लेकिन यह फ़ाइल नाम को प्रिंट नहीं करता है।

इस कमांड के अतिरिक्त, हम इसे भी लिख सकते हैं: grep -rn "String to search" / path / to / directory / or / -r: recursive search n: लाइन नंबर मैचों के लिए दिखाया जाएगा


1
खोज संस्करण के लिए Thanx। मेरा grep संस्करण (NAS के लिए व्यस्त) -r विकल्प नहीं है, मुझे वास्तव में एक और समाधान की आवश्यकता है!
जेसी

3
'खोज' संस्करण के लिए धन्यवाद! So .js ’या, .txt’ इत्यादि को फ़िल्टर करने में सक्षम होना इतना महत्वपूर्ण है , कोई भी अंतिम परिवार की छुट्टी से सभी बहु-गीगाबाइट वीडियो खोजने के लिए grep के इंतजार में घंटों बिताना चाहता है, भले ही वह कमान हो टाइप करना आसान है।
१५:

स्वीकार किए गए संस्करण की तुलना में बेहतर grep, क्योंकि स्वीकृत आधे शब्दों की खोज नहीं करता है
waz123


73

किसी दिए गए पाठ वाले फ़ाइल नामों की सूची

सबसे पहले, मेरा मानना ​​है कि आपने -Hइसके बजाय उपयोग किया है -l। इसके अलावा आप इसके बाद उद्धरण के अंदर पाठ जोड़ने की कोशिश कर सकते हैं {} \

find / -type f -exec grep -l "text-to-find-here" {} \; 

उदाहरण

मान लीजिए कि आप अपनी निर्देशिका के अंदर विशिष्ट पाठ "अपाचे लाइसेंस" वाली फाइलों को खोज रहे हैं। यह नीचे के समान परिणाम प्रदर्शित करेगा (आउटपुट आपकी निर्देशिका सामग्री के आधार पर भिन्न होगा)।

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

केस सेंसिटिविटी हटा दें

यहां तक ​​कि अगर आप "टेक्स्ट" बनाम "पाठ" जैसे मामले के बारे में उपयोग नहीं कर रहे हैं, तो आप -iमामले को अनदेखा करने के लिए स्विच का उपयोग कर सकते हैं । आप आगे का विवरण यहां पढ़ सकते हैं ।

आशा है कि यह आपकी मदद करता है।


2
जो यह कमांड करता है: यह कमांड को मिलने वाले findसभी रास्तों को पास करेगा grep -l "text-to-find-here" <file found>"। आप फ़ाइल के नाम पर प्रतिबंध जोड़ सकते हैं, उदाहरण के find / -iname "*.txt"लिए केवल फाइलों में खोज करना जो नाम समाप्त होता है.txt
मेंन

1
@ सहायक - पाठकों के लिए किसी भी भ्रम से बचने के लिए एक नमूना आउटपुट शामिल किया गया।
lkamal

2
@ यह वास्तव में एक दुखद स्थिति है कि सहायक की टिप्पणी में आप की तुलना में अधिक वोट हैं ... भले ही उनकी टिप्पणी 2014 से है और आपकी 2017 है कि उनकी टिप्पणी में 6 हैं जब यह ठीक 0 होना चाहिए और आपका केवल एक (अब दो) isn है मैं ऐसा कुछ नहीं मानना ​​चाहता / चाहती हूँ।
प्रीफटन

@ मेने कहा जा रहा है कि -inameमामला असंवेदनशील है, जिसका अर्थ है कि यह भी मिलेगा .TXT फाइलें, उदाहरण के लिए, साथ ही TxT और TXt इत्यादि।
प्रीफटन

66

grep( GNU या BSD )

आप grepपुनरावर्ती वर्तमान फ़ोल्डर को खोजने के लिए टूल का उपयोग कर सकते हैं , जैसे:

grep -r "class foo" .

नोट: -r- पुन : खोज उपनिर्देशिका।

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

grep "class foo" **/*.c

नोट: ग्लोबिंग विकल्प ( **) का उपयोग करके , यह विशिष्ट एक्सटेंशन या पैटर्न के साथ सभी फ़ाइलों को पुनरावर्ती रूप से स्कैन करता है। इस सिंटैक्स को सक्षम करने के लिए, चलाएँ shopt -s globstar:। आप **/*.*सभी फ़ाइलों (छिपी और बिना विस्तार के छोड़कर) या किसी अन्य पैटर्न के लिए भी उपयोग कर सकते हैं ।

यदि आपकी त्रुटि है कि आपका तर्क बहुत लंबा है, तो अपनी खोज को कम करने पर विचार करें, या findइसके बजाय सिंटैक्स का उपयोग करें :

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

वैकल्पिक रूप से उपयोग करें ripgrep

ripgrep

यदि आप बड़ी परियोजनाओं या बड़ी फ़ाइलों पर काम कर रहे हैं, तो आपको ripgrepइसके बजाय उपयोग करना चाहिए , जैसे:

rg "class foo" .

GitHub प्रोजेक्ट पेज पर डॉक्स, इंस्टॉलेशन स्टेप्स या सोर्स कोड चेक करें ।

यह बहुत जल्दी की तरह किसी भी अन्य उपकरण से है जीएनयू / बीएसडी grep , ucg, ag, sift, ack, ptया इसी तरह की है, क्योंकि यह के शीर्ष पर बनाया गया है जंग के regex इंजन जो परिमित ऑटोमेटा, SIMD और आक्रामक शाब्दिक अनुकूलन बहुत तेजी से खोज करने के लिए उपयोग करता है।

यह .gitignoreफ़ाइलों में निर्दिष्ट पैटर्न को अनदेखा करने का समर्थन करता है , इसलिए एक ही फ़ाइल पथ को एक साथ कई ग्लोब पैटर्न के खिलाफ मिलान किया जा सकता है।


आप आम मापदंडों का उपयोग कर सकते हैं जैसे:

  • -i - असंवेदनशील खोज।
  • -I - बाइनरी फ़ाइलों को अनदेखा करें।
  • -w - पूरे शब्दों के लिए खोजें (आंशिक शब्द मिलान के विपरीत)।
  • -n - अपने मैच की लाइन दिखाएं।
  • -C/ --context(जैसे -C5) - संदर्भ बढ़ता है, इसलिए आप आसपास के कोड को देखते हैं।
  • --color=auto - मिलान पाठ को चिह्नित करें।
  • -H - जहाँ फ़ाइल मिलती है फ़ाइल नाम प्रदर्शित करता है।
  • -c- मिलान लाइनों की संख्या प्रदर्शित करता है। के साथ जोड़ा जा सकता है -H

1
मुझे विस्तारित ग्लोबिंग उपयोगी भी लगता है। लेकिन ध्यान रखें कि यदि वास्तव में बड़ी संख्या में फाइलें हैं, तो आप "तर्क सूची बहुत लंबी" त्रुटि प्राप्त कर सकते हैं। (साधारण ग्लोबिंग भी इस तरह की त्रुटि का खतरा है)।
योरी एन।

2
संपूर्ण फ़ाइल सिस्टम के लिए, आरजी लगभग किसी अन्य उपकरण की तुलना में बहुत कम दर्दनाक होने वाला है।
lk

55

यदि आपका grepपुनरावर्ती खोज का समर्थन नहीं करता है, तो आप इसके findसाथ संयोजन कर सकते हैं xargs:

find / -type f | xargs grep 'text-to-find-here'

मुझे यह प्रारूप के मुकाबले याद रखने में आसान लगता है find -exec

यह फ़ाइल नाम और मिलान लाइन की सामग्री जैसे, आउटपुट देगा

/home/rob/file:text-to-find-here

वैकल्पिक झंडे जिन्हें आप जोड़ना चाह सकते हैं grep:

  • -i - केस असंवेदनशील खोज
  • -l - केवल उस फ़ाइलनाम को आउटपुट करें जहां मैच मिला था
  • -h - केवल उसी लाइन का उत्पादन करें जो मेल खाती है (फ़ाइल नाम नहीं)

3
यह grep 'text-to-find-here'फ़ाइल नाम के बिना के बराबर है अगर findकुछ भी नहीं मिलता है। यह लटकाएगा और उपयोगकर्ता इनपुट की प्रतीक्षा करेगा! के --no-run-if-emptyविकल्प के रूप में जोड़ें xargs
हगेलो

3
खोज और xargs का यह संयोजन उस उद्देश्य के अनुसार काम नहीं करता है जब फ़ाइल या निर्देशिका नामों में रिक्त स्थान होते हैं (वर्ण जो अलग-अलग के रूप में व्याख्या करते हैं)। का उपयोग करें find … -exec grep … +। यदि आप xargs के साथ मिल का उपयोग करने पर जोर देते हैं, तो उपयोग करें -print0और -0
हैगेलो

43
grep -insr "pattern" *
  • i: PATTERN और इनपुट फाइल दोनों में केस के अंतर को अनदेखा करें।
  • n: अपने इनपुट फ़ाइल के भीतर 1-आधारित लाइन नंबर के साथ आउटपुट की प्रत्येक पंक्ति को उपसर्ग करें।
  • s: कोई भी नहीं या बिना पढ़ी गई फ़ाइलों के बारे में त्रुटि संदेश दबाएं।
  • r: प्रत्येक निर्देशिका के अंतर्गत, पुनरावर्ती रूप से सभी फाइलें पढ़ें।

3
क्या आप बता सकते हैं कि अन्य उत्तरों पर आपका उत्तर कैसे सुधरता है, या यह उनसे पर्याप्त रूप से भिन्न कैसे है?
एमोस कारपेंटर

याद रखने के लिए अधिक जटिल नहीं, सभी पैटर्न को कवर करेगा (केस-सेन्स्टिविटी -> बंद, इसमें फ़ाइल-नाम और लाइन नंबर शामिल हैं और पुनरावर्ती खोज आदि करेंगे) और अंत में "*" का उपयोग करके सभी निर्देशिकाओं को खोज लेंगे (कोई निर्दिष्ट करने की आवश्यकता नहीं है) पथ या निर्देशिका नाम)।
enfinet

क्षमा करें, मुझे स्पष्ट होना चाहिए: यदि आप अपने उत्तर में उस स्पष्टीकरण को शामिल कर सकते हैं तो यह बहुत अच्छा होगा। यह पहले से ही खड़ा है, के रूप में विशेष रूप से बहुत से अन्य समान जवाब के साथ, यह इस तरह के एक संक्षिप्त उत्तर क्या कोशिश कर के लाभ से देखने के लिए मुश्किल है यह स्वीकार किए जाते हैं जवाब या upvoted लोगों में से एक पर होगा।
एमोस कारपेंटर

6
@ AmosM.Carpenter इस उत्तर के बारे में एक बात जो मुझे पसंद है, वह दलील के तर्क की ओर इशारा करती है, जो शोर को छानने में मदद कर सकती है जो वास्तव में हम चाहते हैं कि परिणाम प्राप्त करने के लिए कोई फर्क नहीं पड़ता। ग्रेप कुछ निश्चित "फाइलों" पर "फ़ंक्शन लागू नहीं किया गया", "अमान्य तर्क", "संसाधन अनुपलब्ध", इत्यादि जैसी त्रुटियों को प्रिंट करता है।
leetNightshade

@leetNightshade: मैं मान रहा हूं कि आप अपनी टिप्पणी मुझे दे रहे हैं क्योंकि मैंने विरल मूल पोस्ट पर स्पष्टीकरण मांगा था। कृपया मेरी पिछली टिप्पणियों को समझने के लिए फैबियो के शानदार संशोधन देखें ।
एमोस कारपेंटर

39

द सिल्वरसर्चर नामक एक नई उपयोगिता है

sudo apt install silversearcher-ag

यह Git और अन्य VCS के साथ मिलकर काम करता है। तो आप को .git या किसी अन्य निर्देशिका में कुछ भी नहीं मिलेगा ।

आप बस उपयोग कर सकते हैं

ag "Search query"

और यह आपके लिए कार्य करेगा!


35

मुझे लिनक्स पर विशिष्ट पाठ वाली सभी फाइलें कैसे मिलेंगी? (...)

मैं दो बार इस समाधान में आया:

find / -type f -exec grep -H 'text-to-find-here' {} \;


यदि आपके उदाहरण में खोज का उपयोग कर रहे हैं , तो बेहतर जोड़ने -s( --no-messages) grepऔर 2>/dev/nullआदेश के अंत में बहुत से अनुमति से इनकार संदेशों से बचने के लिए grepऔर find:

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

फाइल्स को खोजने के लिए मानक उपकरण है - यूनिक्स जैसे प्लेटफॉर्म पर - विशिष्ट पाठ की तलाश करते समय grep के साथ संयुक्त। खोजने के आदेश अक्सर के साथ संयुक्त है xargs , वैसे।

एक ही उद्देश्य के लिए तेज़ और आसान उपकरण मौजूद हैं - नीचे देखें। बेहतर उन्हें आज़माएं, बशर्ते वे आपके मंच पर उपलब्ध हों , बेशक:

तेज़ और आसान विकल्प

RipGrep - आसपास का सबसे तेज़ खोज टूल:

rg 'text-to-find-here' / -l

रजत खोजक :

ag 'text-to-find-here' / -l

ack :

ack 'text-to-find-here' / -l

नोट: आप 2>/dev/nullकई त्रुटि संदेशों को छिपाने के लिए इन कमांडों को भी जोड़ सकते हैं ।


चेतावनी : जब तक आप वास्तव में इसे टाल नहीं सकते, तब तक '/' (मूल निर्देशिका) से खोज न करें, एक लंबी और अक्षम खोज से बचने के लिए! इसलिए ऊपर दिए गए उदाहरणों में, आप " / 'को उप-निर्देशिका नाम, जैसे" / घर "से बदलेंगे, जहां आप वास्तव में खोज करना चाहते हैं ...


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

".... विशिष्ट पाठ युक्त ...": वाक्य का यह हिस्सा सटीक नहीं था (क्योंकि यह स्वयं नहीं है जो खोज के इस भाग से संबंधित है)। संपादित। धन्यवाद।
बल्डज़ि

सहायता करके हमें खुशी होगी! बहुत ही तेज नज़र में एकमात्र चीज़ फ़ोल्डर को निर्देशिका में बदल रही है लेकिन मुझे पता है कि मेरा एक धर्मयुद्ध है जो मैं कभी भी पूरी तरह से नहीं जीत पाऊंगा। हालांकि नहीं दे रहा है ...
प्रिएफ्टन

"फ़ोल्डर" के बजाय "निर्देशिका" क्यों नहीं, लेकिन क्यों? कृपया अपना "धर्मयुद्ध" साझा करें!
17

मैं कह रहा हूँ बजाय निर्देशिका का उपयोग करें! इसका उल्लेख करते हुए: आप उप-फ़ोल्डर नाम से बेहतर '/' को बदल देंगे और यह मेरा एक पालतू जानवर है .. क्योंकि यहां तक ​​कि विंडोज इसे 'निर्देशिका' भी कहता था। आह..मैंने तुम्हें वो पा लिया। क्यों? ठीक है क्योंकि यह है कि यह क्या कहा जाता है। इसे फाइल सिस्टम स्तर पर भी कहा जाता है। और इसे इस तरह से देखें: क्या इसे कभी (डॉस के लिए) कहा गया था fol? नहीं बिलकुल नहीं; यह कहा जाता था dir(और मुझे विश्वास है कि यह अभी भी है)। फ़ोल्डर एक ऐसी चीज़ है जिसके लिए (मुझे लगता है) उपयोगकर्ता मित्रता के लिए वंचित है, हालांकि इस मामले में यह शायद कम 'उन्नत' उपयोगकर्ताओं के लिए इसे डंप कर रहा है?
प्रीफटन

29

प्रयत्न:

find . -name "*.txt" | xargs grep -i "text_pattern"

5
यह वास्तव में जब xargsउस तरह का उपयोग नहीं करने का एक प्रमुख उदाहरण है .. इस पर विचार करें। echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this fooxargsयहाँ गलत फ़ाइल मेल खाते हैं और इरादा फ़ाइल से मेल नहीं खाती। या तो find .. -print0 | xargs -0 ...एक पाइप का उपयोग करें, लेकिन एक बेकार उपयोग या बेहतर हैfind ... -exec grep ... {} +
श्लोब

29

pwdकिसी भी निर्देशिका से खोज करने के लिए उपयोग करें , नीचे की ओर फिर से

grep -rnw `pwd` -e "pattern"

अपडेट आपके द्वारा उपयोग किए जा रहे grep के संस्करण के आधार पर, आप छोड़ सकते हैं pwd.यदि कोई निर्देशिका इस प्रकार दी गई है, तो नए संस्करणों को grep के लिए डिफ़ॉल्ट मामला प्रतीत होता है:

grep -rnw -e "pattern"

या

grep -rnw "pattern"

ऊपर के रूप में एक ही बात करेंगे!


3
का उपयोग pwdकरना आवश्यक नहीं है, क्योंकि यह डिफ़ॉल्ट है। grep -rnw "pattern"पर्याप्त होता।
फेडोरक्वी 'SO रोकना नुकसान पहुँचाता है'

और वास्तव में grep -rnwतीन साल पहले की तरह ही उत्तर दिया गया था, मुझे नहीं लगता कि यह उत्तर कैसे मूल्य जोड़ रहा है।
फेडोरक्वी 'एसओ ने

चयनित उत्तर डिफ़ॉल्ट पैटर्न नहीं दिखाता है, और 5 लोगों को यह उपयोगी लगा था
महात्मनिच

"डिफ़ॉल्ट पैटर्न" से आपका क्या तात्पर्य है? स्वीकृत उत्तर में grep -rnw '/path/to/somewhere/' -e "pattern"वह है जो आपके यहाँ है। 2.3M यात्राओं के बाद 5 वोटों का मतलब यह नहीं है।
फेडोरक्वी 'एसओ ने' डिक

मैं सहमत हूं कि जो मैं मूल उत्तर में याद कर रहा था वह उपयोग का मामला है जिसे आपको बिल्कुल भी रास्ता नहीं देना है या वर्तमान निर्देशिका की पुनरावृत्ति खोजनी है जो स्वीकृत उत्तर में परिलक्षित नहीं होती है। इस प्रकार यह थोड़ा गहरा खुदाई करने के लिए grep के बारे में एक अच्छा सीखने का अनुभव था।
महात्मनिच

19

grep यहां तक ​​कि अगर हम एक स्ट्रिंग के लिए नहीं देख रहे हैं तो भी इस्तेमाल किया जा सकता है।

बस चल रहा है,

grep -RIl "" .

सभी पाठ फ़ाइलों के लिए पथ प्रिंट करेगा, अर्थात केवल मुद्रण योग्य वर्ण वाले।


2
मैं नहीं दिख रहा है कि यह कैसे एक मात्र का उपयोग कर से बेहतर है lsया find(पुनरावर्ती के लिए)
fedorqui 'तो बंद को नुकसान पहुँचाने'

17

यहां कई कमांड्स की सूची दी गई है जिनका उपयोग फाइल को खोजने के लिए किया जा सकता है।

grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "word-1|word-2” directory-path

egrep -w -R "word-1|word-2” directory-path

5
यह मौजूदा उत्तरों में क्या जोड़ रहा है?
फेडोरक्वी 'SO रोकना नुकसान पहुँचाता है'

@fedorqui egrepके बराबर है grep -Eऔर इसका मतलब है कि --extended-regexpआप यहाँ विवरण पा सकते हैं unix.stackexchange.com/a/17951/196072
omerhakanbilici

17

सिल्वर सर्चर एक भयानक उपकरण है, लेकिन रिपग्रेप और भी बेहतर हो सकता है।

यह लिनक्स, मैक और विंडोज पर काम करता है, और कुछ महीने पहले हैकर न्यूज़ पर लिखा गया था (इसमें एंड्रयू गैलेंट के ब्लॉग का लिंक है, जिसमें GitHub लिंक है):

Ripgrep - एक नया कमांड लाइन सर्च टूल


15
find /path -type f -exec grep -l "string" {} \;

टिप्पणियों से स्पष्टीकरण

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

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename

15

प्रयत्न:

find / -type f -exec grep -H 'text-to-find-here' {} \;

जो सभी फ़ाइल सिस्टम को खोजेगा, क्योंकि /रूट फ़ोल्डर है।

घर फ़ोल्डर उपयोग के लिए:

find ~/ -type f -exec grep -H 'text-to-find-here' {} \;

वर्तमान फ़ोल्डर उपयोग के लिए:

find ./ -type f -exec grep -H 'text-to-find-here' {} \;

शायद फ़ोल्डरों के अंतर पर विवरण कई के लिए स्पष्ट हैं ... लेकिन यह भी newbies के लिए बहुत उपयोगी है। +1
नीलोन

1
यह मौजूदा उत्तरों में क्या जोड़ रहा है?
फेडोरक्वी 'SO

इसे मेरा धर्मयुद्ध कहें लेकिन शब्द 'निर्देशिका' है। यह विंडोज नहीं है (जो वैसे भी 'डायरेक्टरी' का उपयोग करता था - पूर्व 9x)। कृपया 'फ़ोल्डर' कहना बंद करें। अपने अंतिम आदेश के लिए भी आपको '' FYI 'की आवश्यकता नहीं है।
प्रीफटन

15

आशा है कि यह सहायता की है ...

grepआउटपुट में अधिक जानकारी देने के लिए थोड़ा विस्तार करते हुए , उदाहरण के लिए, फ़ाइल में लाइन नंबर प्राप्त करने के लिए जहां पाठ किया जा सकता है:

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

और तुम एक विचार क्या फ़ाइल प्रकार आप के लिए खोज करने के लिए, इस मामले में फ़ाइल प्रकार एक्सटेंशन निर्दिष्ट करके नीचे अपनी खोज को संकीर्ण कर सकते हैं अगर .pasया .dfmफ़ाइलें:

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

विकल्पों की संक्षिप्त व्याख्या:

  1. .में findवर्तमान निर्देशिका से निर्दिष्ट करता है।
  2. -name" *.*": सभी फाइलों के लिए (-name " *.pas" -o -name " *.dfm"): केवल *.pasOR *.dfmफाइलें, या के साथ निर्दिष्ट-o
  3. -type f निर्दिष्ट करता है कि आप फ़ाइलों की तलाश कर रहे हैं
  4. -print0और (पाइप) --nullके दूसरी तरफ |महत्वपूर्ण हैं, फाइलनाम findको grepएम्बेडेड में से पास करना xargs, फाइलनामों में रिक्त स्थान के साथ फाइलनाम के पारित होने की अनुमति देना, grep को पथ का इलाज करने और एक स्ट्रिंग पर फ़ाइल नाम देने की अनुमति देता है, और इसे प्रत्येक स्थान पर न तोड़ें।

-name '*.*'आप जो कहते हैं वह नहीं है; यह 'फ़ाइल' नामक फ़ाइल को नहीं उठाएगा क्योंकि पैटर्न उस (समान .ext) के बराबर नहीं है; *हालांकि (अच्छी तरह से एक तरफ फ़ाइलें) होगा। लेकिन एक और बात है: यदि आप सभी फाइलें चाहते हैं तो पहली जगह में फाइल का नाम निर्दिष्ट करने में परेशान क्यों होना चाहिए? कोई अन्य टिप्पणी नहीं - सिवाय इसके कि यह जानना अच्छा है कि अभी भी ऐसे लोग हैं जो एमएस शब्दावली 'फ़ोल्डर' का उपयोग नहीं करते हैं (जो वास्तव में यह कहने के बाद कि मैं पर्याप्त नहीं जोड़ूंगा, लेकिन मैं आपके द्वारा किए गए थोड़े गलत कथन को इंगित करना चाहता था फ़ाइल नामों के साथ - साथ 'सभी' के मामले में अतिरेक / व्यर्थता)।
प्रीफटन

15

एक सरल findकाम कर सकते हैं। इसे अपनी ~/.bashrcफ़ाइल में उर्फ ​​करें :

alias ffind find / -type f | xargs grep

एक नया टर्मिनल शुरू करें और जारी करें:

ffind 'text-to-find-here'

14

मैंने पायथन लिपि लिखी जो कुछ इसी तरह की है। इस लिपि का उपयोग इस प्रकार करना चाहिए।

./sniff.py path pattern_to_search [file_pattern]

पहला तर्क, pathवह निर्देशिका है जिसमें हम पुनरावर्ती खोज करेंगे। दूसरा तर्क, pattern_to_searchएक नियमित अभिव्यक्ति है जिसे हम किसी फ़ाइल में खोजना चाहते हैं। हम पायथन re लाइब्रेरी में परिभाषित नियमित अभिव्यक्ति प्रारूप का उपयोग करते हैं । इस स्क्रिप्ट में, .न्यूलाइन से भी मेल खाता है।

तीसरा तर्क, file_patternवैकल्पिक है। यह एक और नियमित अभिव्यक्ति है जो फ़ाइल नाम पर काम करती है। केवल वे फाइलें जो इस नियमित अभिव्यक्ति से मेल खाती हैं, उन पर विचार किया जाएगा।

उदाहरण के लिए, यदि मैं शब्द के बाद pyवाले एक्सटेंशन के साथ पायथन फाइलें खोजना चाहता हूं, तो मैं निम्नलिखित कार्य करता हूं,Pool(Adaptor

./sniff.py . "Pool(.*?Adaptor"  .*py
./Demos/snippets/cubeMeshSigNeur.py:146 
./Demos/snippets/testSigNeur.py:259 
./python/moose/multiscale/core/mumbl.py:206 
./Demos/snippets/multiComptSigNeur.py:268 

और वोइला, यह मिलान की गई फ़ाइलों और लाइन नंबर का पथ उत्पन्न करता है जिस पर मैच मिला था। यदि एक से अधिक मैच पाए गए, तो प्रत्येक पंक्ति संख्या को फ़ाइल नाम में जोड़ा जाएगा।


14

यदि आप सख्ती से उपयोग करना चाहते हैं findतो उपयोग करें find + grep:

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

कदम:

1. findफ़ाइलों को खोजने के लिए प्रयोग करें,
2. फिर grepउन सभी पर अमल करें।

यह आपको findफ़ाइलों को खोजने की शक्ति दे सकता है ।

  • -name Patternयदि आप grepकेवल कुछ फ़ाइलों का उपयोग करना चाहते हैं :

    find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

आप इसके साथ खेल सकते हैं और findअपनी फ़ाइल खोज को बेहतर या संकीर्ण करने के विभिन्न विकल्पों का उपयोग कर सकते हैं ।


अंतर क्या है? यह फ़ाइल पथ में रिक्त स्थान के साथ काम करेगा?
पीटर मोर्टेंसन

13

उपयोग:

grep -c Your_Pattern *

यह रिपोर्ट करेगा कि वर्तमान निर्देशिका में प्रत्येक फ़ाइल में आपके पैटर्न की कितनी प्रतियां हैं।


13

grep इसे प्राप्त करने के लिए आपका अच्छा दोस्त है।

grep -r <text_fo_find> <directory>

यदि आपको खोजने के लिए पाठ के मामले की परवाह नहीं है, तो उपयोग करें:

grep -ir <text_to_find> <directory>

मेरे मामले में ऐसा लगता है कि यह हर जगह खोज करता है, भले ही मैं निर्देशिका को निर्दिष्ट करूं
Pathros

@Pathros संभवतः पुनरावृत्ति सक्षम और आपके द्वारा निर्दिष्ट निर्देशिका के साथ क्या करना है। एक और तरीका रखो पुनरावृत्ति उस तरह से चीजों को बदल देती है।
प्रीफटन

@Pathros ओह और अगर -खोज स्ट्रिंग में कोई s हैं तो आप --पहले grep पास करना चाहते हैं ; अन्यथा दिलचस्प दुष्प्रभाव हो सकते हैं!
प्रीफटन

13

मैं इस बात से मोहित हूं कि कैसे सरल grep इसे 'आरएल' के साथ बनाता है:

grep -rl 'pattern_to_find' /path/where/to/find

-r to recursively find a file / directory inside directories..
-l to list files matching the 'pattern'

पाठ के बाद फ़ाइल नाम देखने के लिए 'l' के बिना '-r' का प्रयोग करें जिसमें पैटर्न पाया जाता है !

grep -r 'pattern_to_find' /path/where/to/find

यह एकदम सही काम करता है ...


यह Git Bash (विंडोज) में भी काम करता है ।
पीटर मोर्टेंसन

लेकिन इसका अर्थ है कि हर फ़ाइल को खोजा जाना चाहिए (फ़ाइल नाम या फ़ाइल एक्सटेंशन स्तर पर कोई फ़िल्टर नहीं, जैसे .txt)। या ऐसा करने का कोई तरीका है?
पीटर मोर्टेंसन

12

स्ट्रिंग और आउटपुट को खोजने के लिए खोज स्ट्रिंग के साथ बस उस लाइन को आउटपुट करें:

for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done

उदाहरण के लिए:

for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done

खोज स्ट्रिंग वाले फ़ाइलनाम को प्रदर्शित करने के लिए:

for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

उदाहरण के लिए:

for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;

1
मैं उपयोग करने की तुलना में केवल नकारात्मक पक्ष देखता हूं find … -exec grep 'str' {} \;(यदि आपको findबिल्कुल उपयोग करना है)।
phk

1
यह बहुत बुरी तरह से टूट जाएगा अगर किसी भी फाइल में findसम्‍मिलित स्‍पेस पाए जाते हैं .. आप greppingगलत फाइलों को समाप्त कर सकते हैं और / या सही फाइलों को पूरी तरह से गायब कर सकते हैं। find ... -exec grep ...अगर आपको उपयोग करने की आवश्यकता है तो बस उपयोग करें find.. लेकिन इस मामले में एक grep -r ...पर्याप्त है।
शलभ

1
फिर grep को खोजने के परिणामों पर एक लूप का उपयोग करने का क्या मतलब है? यह अनावश्यक रूप से जटिल हो जाता है।
फेडोरक्वी 'SO रोकना नुकसान पहुँचाता है'

12

एक ackउपकरण है जो आप के लिए देख रहे हैं कि वास्तव में क्या करेंगे।

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

आप -iकेस संवेदनशील खोज के लिए उपेक्षा कर सकते हैं


2
यह मौजूदा उत्तरों में क्या जोड़ रहा है? यह तीन साल पहले ही सुझाया गया था।
फेडोरक्वी 'एसओ

1
@fedorqui 1) कोई पाइपिंग नहीं! 2) नियमित अभिव्यक्ति का उपयोग करें 3) लाइन नंबर प्राप्त करें, रिश्तेदार पथ के साथ फ़ाइल का नाम, हाइलाइट किए गए पाठ आदि को खोज के बाद संपादन के लिए उपयोगी जैसे "vim + lineno path / file.cpp" आपको बिना किसी रुचि के लाइन में मिल जाएगा। मेरे खोज फ़ोल्डर और सबफ़ोल्डर्स के तहत "ack शामिल \" है कि खोज "शामिल" या "hpp" कीवर्ड के कमांड का आउटपुट देखें। मुझे उम्मीद है कि बात स्पष्ट है। यहां नमूना आउटपुट (सरल पाठ के साथ कीवर्ड हाइलाइट्स नहीं दिखा सकता है) प्रक्रिया / child.hpp 11: बढ़ावा / प्रक्रिया / child.hpp प्रक्रिया / all.hpp 21: #include <बढ़ावा / प्रक्रिया / निष्पादित करें
पाल

12

पिछले सभी उत्तर grep और खोजने का सुझाव देते हैं। लेकिन एक और तरीका है: मिडनाइट कमांडर का उपयोग करें

यह एक मुफ्त उपयोगिता है (30 वर्ष की उम्र, समय से साबित) जो कि GUI होने के बिना दृश्य है। इसमें बहुत सारे कार्य हैं, और फाइलें ढूंढना उनमें से एक है।


रेंजर एक ही विचार में होगा
निलोन

11

नीचे का कमांड इस दृष्टिकोण के लिए ठीक काम करेगा:

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;

2
का उपयोग कर के बिंदु क्या है findऔर उसके बाद grep -r? वे उसी के लिए हैं, इसलिए यह बेमानी है।
फेडोरक्वी 'एसओ

ओह !! सही है, वास्तव में फ़िल्टर्ड फ़ाइलों पर grep चलाने के लिए है और सभी नहीं, धन्यवाद
प्रदीप गोस्वामी

2
फिर भी, इसका कोई मतलब नहीं है, आप के साथ फ़िल्टर कर सकते हैं find
फेडोरक्वी 'एसओ स्टॉप' नुकसान

11

परेशानी से बचें और ack-grep स्थापित करें। यह बहुत सी अनुमति और उद्धरण मुद्दों को समाप्त करता है।

apt-get install ack-grep

फिर जिस डायरेक्टरी में आप सर्च करना चाहते हैं, उसके नीचे जाएं और कमांड को रन करें

cd /
ack-grep "find my keyword"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.