एक फ़ोल्डर के अंदर एक शब्द खोजने के लिए मैं grep का उपयोग कैसे कर सकता हूं?


542

विंडोज में, मैंने एक फ़ोल्डर के अंदर एक शब्द खोजने के लिए एक खोज की होगी। इसी तरह, मैं यह जानना चाहता हूं कि क्या कोई विशेष शब्द किसी निर्देशिका के अंदर होता है जिसमें कई उप-निर्देशिकाएं और फाइलें होती हैं। Grep सिंटैक्स के लिए मेरी खोजों से पता चलता है कि मुझे फ़ाइल नाम निर्दिष्ट करना चाहिए, अर्थात grep string filename

अब, मैं फ़ाइल नाम नहीं जानता, तो मैं क्या करूँ? एक दोस्त ने करने का सुझाव दिया grep -nr string, लेकिन मुझे नहीं पता कि इसका क्या मतलब है और मुझे इसके साथ कोई परिणाम नहीं मिला (जब तक मैं जारी नहीं करता ctrl + c) कोई प्रतिक्रिया नहीं है ।

जवाबों:


847
grep -nr 'yourString*' .

अंत में डॉट वर्तमान निर्देशिका खोजता है। प्रत्येक पैरामीटर के लिए अर्थ:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (लगता है चाहेंगे MobileAppServlet.javaया MobileAppServlet.classया MobileAppServlet.txt; 'MobileAppASer*.*'एक और तरीका है एक ही बात करना है।)

अधिक मापदंडों की जांच करने के लिए मैन grep कमांड का उपयोग करें ।


14
व्यवसाय किसके साथ है *? यह या तो शेल वाइल्डकार्ड विस्तार में परिणाम देगा (यदि वाइल्डकार्ड पैटर्न से मेल खाते हुए फ़ाइलनाम हैं), या grep इसे चरित्र पूर्ववर्ती के लिए 0-या अधिक पुनरावृत्ति ऑपरेटर के रूप में ले जाएगा *
usta

7
अब हम दोनों संभावनाओं पर विचार के लिए जाने grep -nr MobileAppSer* .1. मान लें हम वर्तमान निर्देशिका मिलान में 3 फ़ाइलें MobileAppSer*वाइल्डकार्ड पैटर्न: नामित MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt। फिर grepइस तरह आमंत्रित किया जाएगा grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .:। इसका मतलब है कि "MobileAppServlet.class" पाठ के लिए खोज MobileAppServlet.java, MobileAppServlet.txt, और वर्तमान निर्देशिका में कहीं और - जो निश्चित रूप से उपयोगकर्ता यहां नहीं चाहता है।
usta

7
2. यदि MobileAppSer*वाइल्डकार्ड पैटर्न से मेल खाते वर्तमान निर्देशिका में कोई फाइल नहीं है , grepतो तर्क MobileAppSer*को इस रूप में प्राप्त किया जाएगा और इस प्रकार इसे "आर" के 0 या उससे अधिक होने वाले पाठ "मोबाइलएपस" की खोज के रूप में लिया जाएगा, इसलिए यह होगा वर्तमान निर्देशिका की फ़ाइलों की सामग्री में "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr" इत्यादि ग्रंथों को खोजने का प्रयास किया गया है - न कि वह जो उपयोगकर्ता चाहता है।
usta

5
यह रेगेक्स का एक संदिग्ध विकल्प है। उस्ता ने यह इंगित किया है।
किंसीमपल

117
grep -nr string my_directory

अतिरिक्त नोट: यह सिंटैक्स को संतुष्ट करता है grep [options] string filenameक्योंकि यूनिक्स जैसी प्रणालियों में, एक निर्देशिका एक प्रकार की फ़ाइल है (विशेष रूप से उन संस्थाओं को संदर्भित करने के लिए "नियमित फ़ाइल" एक शब्द है जो विंडोज में सिर्फ "फाइलें" कहलाती हैं)।

grep -nr string मानक इनपुट से खोज करने के लिए सामग्री पढ़ता है, यही कारण है कि यह सिर्फ आप से इनपुट के लिए इंतजार कर रहा है, और ऐसा करने से रोकता है जब आप ^ C दबाते हैं (यह ^ D पर भी बंद हो जाएगा, जो अंत के लिए महत्वपूर्ण संयोजन है -file)।


1
अरे, अगर मैं मामले की परवाह किए बिना एक स्ट्रिंग की खोज करना चाहता हूं, तो मुझे यह करना चाहिए: grep -i -nr "my word"।
किकी

2
@kiki: हाँ, जो grep -inr "my word" .
usta

16
@kiki: -rgrep के लिए इसका मतलब है कि उपनिर्देशिकाओं में पुनरावर्ती रूप से खोज करें और -nफ़ाइल की संबंधित पंक्ति संख्या के साथ आउटपुट की प्रत्येक पंक्ति को उपसर्ग करें, जिसमें वह रेखा शामिल हो। man grepइस सब का वर्णन करता है, और बहुत कुछ।
usta

62

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

grep -R "your word" .

-nलाइन नंबर को प्रिंट करेगा, जहां यह फाइल में मेल खाता है।
-iकेस-असंवेदनशील (पूंजी / गैर-पूंजी पत्र) खोजेंगे।

grep -inR "your regex pattern" .

3
./* का अर्थ है कि वर्तमान निर्देशिका की सभी फाइलें; -आर का अर्थ है पुनरावर्ती (उपनिर्देशिका आदि खोजना)
स्टीफन स्टीगर

25
grep -nr search_string search_dir

एक RECURSIVE (निर्देशिका का अर्थ है और यह सब उप-निर्देशिका है) search_string के लिए खोज करता है। (जैसा कि usta द्वारा सही उत्तर दिया गया है)।

आपके मित्र के सुझाव से आपको कोई चिंता नहीं हो रही है:

grep -nr string

क्योंकि कोई निर्देशिका निर्दिष्ट नहीं की गई थी। यदि आप उस निर्देशिका में हैं जिसे आप खोज करना चाहते हैं, तो आपको निम्नलिखित कार्य करने होंगे:

grep -nr string .

'को शामिल करना महत्वपूर्ण है। चरित्र, जैसा कि इस निर्देशिका को खोजने के लिए grep बताता है।


नमस्ते, मुझे क्या करना चाहिए, अगर मुझे बीच में एक जगह के साथ 2 शब्दों की खोज करनी है? क्या शब्दों को उद्धरणों में निर्दिष्ट किया जाना चाहिए? यानी grep -nr "my word"।
किकी

24

वहाँ भी:

find directory_name -type f -print0 | xargs -0 grep -li word

लेकिन यह एक शुरुआत के लिए थोड़ा बहुत हो सकता है।

findएक सामान्य उद्देश्य निर्देशिका वॉकर / लिस्टर है, -type fजिसका अर्थ है "निर्देशिकाओं और नामित पाइपों के बजाय सादे फ़ाइलों की तलाश करें और आपके पास क्या है", का -print0अर्थ है "उन्हें मानक आउटपुट पर डेलिमीटर के रूप में उपयोग करके प्रिंट करें"। से आउटपुट findभेजा जाता है xargs -0और वह अपने मानक इनपुट को चंक्स में (कमांड लाइन की लंबाई सीमाओं से बचने के लिए) एक रिकॉर्ड सेपरेटर (मानक न्यूलाइन के बजाय) के रूप में उपयोग करता है और grep -li wordफाइलों के प्रत्येक सेट पर लागू होता है। साधन पर grep, -l"मेल खाने वाली फ़ाइलों की सूची" और -i"केस असंवेदनशील" का अर्थ है; आप आमतौर पर एकल वर्ण विकल्पों को जोड़ सकते हैं ताकि आप -liअधिक से अधिक बार देखेंगे -l -i

यदि आप उपयोग नहीं करते हैं -print0और -0फिर आप फ़ाइल नामों के साथ समस्याओं में भाग लेंगे, जिसमें रिक्त स्थान शामिल हैं, इसलिए उनका उपयोग करना एक अच्छी आदत है।


1
@mmmshuddup: धन्यवाद। मुझे बुरा लगता है अगर मैं जवाब के हिस्से के रूप में स्पष्टीकरण नहीं देता, खासकर जब एक शुरुआत के साथ काम कर रहा हूं।
म्यू

1
इस साइट पर मुझे सबसे ज्यादा सराहना मिली है। यह याद रखना महत्वपूर्ण है कि हम सभी एक बार शुरुआती थे और यह तकनीक की दुनिया में आसान नहीं है!
हाँ बैरी

क्या मैं कुछ निर्देशिकाओं को बाहर कर सकता हूँ? @ म्युइस्टोशॉर्ट
फेरोलिक्स

@Ferologics man findआपके findसमर्थन का क्या विकल्प है, यह देखने के लिए कमांड लाइन से जांच होनी चाहिए ।
म्यू

8

उप-निर्देशिकाओं में सभी उदाहरणों को खोजने के लिए एक पुनरावर्ती खोज क्यों न करें:

grep -r 'text' *

यह एक आकर्षण की तरह काम करता है।


1
रिक्त स्थान जैसे विशेष वर्णों वाले खोज स्ट्रिंग को उद्धृत करने की आवश्यकता नहीं है
स्कॉट स्टेंसलैंड

5
  1. grep -r "yourstring" * किसी भी फाइल और फोल्डर में "yourstring" पाएंगे

अब यदि आप एक ही समय में दो अलग-अलग तारों की तलाश करना चाहते हैं तो आप हमेशा विकल्प ई का उपयोग कर सकते हैं और खोज के लिए शब्द जोड़ सकते हैं। ब्रेक के बाद का उदाहरण

  1. grep -rE "yourstring|yourotherstring|$" *उन स्थानों की खोज करेगा जहाँ yourstringया yourotherstringमेल खाते हैं

4

एक अन्य विकल्प जो मुझे उपयोग करना पसंद है:

find folder_name -type f -exec grep your_text  {} \;

-Type f आपको केवल फ़ाइलें और फ़ोल्डर्स नहीं लौटाता है

-exec और {} खोज में पाई गई फ़ाइलों पर grep चलाता है (सटीक सिंटैक्स "-exec कमांड {}" है)।


4
grep -R "string" /directory/

-R अनुसरण नहीं करता है जब -r नहीं करता है।


2

आपके द्वारा चयनित उत्तर ठीक है, और यह काम करता है, लेकिन यह इसे करने का सही तरीका नहीं है, क्योंकि:

grep -nr yourString* .

यह वास्तव में स्ट्रिंग "yourStrin"और "g"0 या कई बार खोज करता है।

तो यह करने का उचित तरीका है:

grep -nr \w*yourString\w* .

यह कमांड वर्तमान फ़ोल्डर में पहले और बाद में किसी भी वर्ण के साथ स्ट्रिंग को खोजता है।


2
हालांकि grep -nr yourStringयह भी काम करता है, क्योंकि यह yourStringलाइन में कहीं भी नंगे दिखता है (या कम से कम यह मेरे सिस्टम पर करता है, OSX शेर)
theheadofabroom

1

@ELRuLL द्वारा पोस्ट किए गए उत्तर के समान, खोज को निर्दिष्ट करने का एक आसान तरीका है जो शब्द सीमाओं का सम्मान करता -wहै:

grep -wnr "yourString" .

Cmd प्रॉम्प्ट या विंडो टर्मिनल में grep शब्द को मान्यता नहीं है
kouty

@kouty grep एक यूनिक्स कमांड है। itechtics.com/using-findstr-windows
ह्यूगो एम।

1

निर्देशिका के अंदर निम्न कमांड चलाएँ (टर्मिनल)। यह उप-सीमाओं के अंदर भी पुन: जाँच करेगा।

grep -r 'your string goes here' * 

0

रिकर्सिवली के लिए निम्न नमूना दिखता your search stringमें *.xmlऔर *.jsफ़ोल्डर के अंदर फ़ाइलों का पता चला कहीं path1, path2और path3

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

तो आप कई निर्देशिकाओं के लिए फ़ाइलों के सबसेट में खोज कर सकते हैं, बस अंत में पथ प्रदान कर सकते हैं।


-4

Grep का उपयोग न करें। सिल्वर सर्चर या रिपग्रेप डाउनलोड करें । वे दोनों बकाया हैं, और विकल्पों के टन के साथ grep या ack की तुलना में तेज़ हैं।


2
ये शायद महान उपकरण हैं, लेकिन यह जवाब नहीं देता है कि ओपी पूछ रहा है कि मैं क्या हासिल करने के लिए इन उपकरणों का उपयोग करूंगा।
१५:
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.