मैं स्ट्रिंग का उपयोग करने वाली सभी फाइलों के लिए वर्तमान निर्देशिका को खोजने के लिए grep का उपयोग कैसे करूं "स्ट्रिंग" अभी तक केवल .h और .cc फ़ाइलों को प्रदर्शित करता है?


138

मैं किसी भी और सभी फ़ाइलों को स्ट्रिंग "हैलो" के लिए वर्तमान निर्देशिका को खोजने के लिए grep का उपयोग कैसे करूं और केवल .h और .cc फ़ाइलों को प्रदर्शित करूं?

जवाबों:


161
grep -r --include=*.{cc,h} "hello" .

यह पढ़ता है: सभी .cc या .h फ़ाइलों के लिए पुनरावर्ती (सभी उप निर्देशिकाओं में) इस .(वर्तमान) निर्देशिका में "हैलो" सम्‍मिलित करें।

एक और स्टैकओवरफ्लो प्रश्न से


5
मूल पोस्ट में आपने कहा था "वर्तमान निर्देशिका" और इसे पुनरावर्ती या उप निर्देशिकाओं में आवश्यकता के बारे में कुछ भी नहीं है (मुझे पता है कि आपने बाद की पोस्ट में इसका उल्लेख किया है)। केवल वर्तमान निर्देशिका में इसे करने के इच्छुक लोगों के लिए, यह grep -si "hello" --include=*.{cc,h} ./* ./.*(साथ ही छिपी हुई फ़ाइलों को खोजता है)। यहां सभी / छिपी हुई फ़ाइलों में एक स्ट्रिंग की खोज करने के लिए एक सामान्य संस्करण है grep -s "hello" * .*:। शायद सबसे आम तौर पर उपयोगी (और सरल), यह "हैलो" के लिए सभी गैर-छिपी हुई फ़ाइलों को खोजता है: grep -si "hello" ./* इस पोस्ट के लिए धन्यवाद: askubuntu.com/a/777456
jbobbins

1
grep -r --include=*.{java,py} "hello" .

किसी कारण से यह macOS पर काम नहीं करता है, यहां तक ​​कि GNU grep उपयोगिता का उपयोग करते समय भी।
xApple

49

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

grep hello *.h *.cc

मैं भी सभी उप निर्देशिका की जरूरत है
stackoverflow

जोड़ना -Rदुर्भाग्य से काम नहीं करता है। यह *पुनरावर्ती जाने से पहले फैलता है ।
डोनाल्ड मिनेर

नौफाल का जवाब है कि आप क्या देख रहे हैं अगर आपको उपनिर्देशिका की आवश्यकता है
डोनाल्ड माइनर

8
@ जैमिन आपको इस बारे में स्पष्ट होना चाहिए कि प्रश्न पूछते समय। यह उत्तर आपके बताए प्रश्न का "सही" उत्तर है।
जोर्डन

$ grep -R hello *# सभी शब्दों में हेलो (उप निर्देशिका सहित) शामिल हैं

19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"

विवरण के लिए findऔर के xargsलिए मैनुअल पृष्ठों की जाँच करें ।


1
आपके पास एक के -print0बाद एक होना चाहिए '*.cc'अन्यथा आपके पास खोज के उस भाग के लिए कोई कार्रवाई नहीं है। या आपको वहाँ कोष्ठक सम्मिलित करना होगा find . \( -name '*.cc' -or -name '*.h' \) -print0:।
जोनाथन लेफ़लर

ध्यान देने के लिए धन्यवाद। मैंने इसका उत्तर "ठीक" करने के लिए संपादित किया है।
नौफाल इब्राहिम

3
आप find -exec +xargs के बजाय सिंटैक्स का उपयोग भी कर सकते हैं
जोर्डन

@ जोर्डनम: हाँ: -exec grep "hello" {} +जहाँ ब्रेसिज़ की जोड़ी फ़ाइल के नाम का प्रतिनिधित्व करती है। अच्छा सुझाव।
जोनाथन लेफ़लर

10

वर्तमान निर्देशिका में खोज करने के लिए पुनरावर्ती:

grep -r 'myString' .

5

यदि आपको एक पुनरावर्ती खोज की आवश्यकता है, तो आपके पास विभिन्न प्रकार के विकल्प हैं। आपको विचार करना चाहिए ack

यदि आपको GNU findऔर xargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

यह /dev/nullसुनिश्चित करता है कि आपको फ़ाइल नाम छपे हों; -print0और -0फ़ाइल वाले रिक्त स्थान के नाम (नई-पंक्तियों, आदि) से संबंधित है।

यदि आपके पास स्थैतिक नाम (रिक्त स्थान आदि के साथ) नहीं हैं, तो आप उपयोग कर सकते हैं:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

यह उन कुछ नामों को ले सकता है जिन्हें आपने इरादा नहीं किया था, क्योंकि पैटर्न मैच फ़्यूज़ियर (लेकिन सरल) है, लेकिन अन्यथा काम करता है। और यह गैर-जीएनयू संस्करणों के साथ काम करता है findऔर xargs


नोट आप यह भी कह सकते हैंfind ... -exec grep "hello" {} +
फेडोरक्वी 'एसओ स्टॉप हॉर्मिंग'

5

यदि मैं आपके प्रश्न को ध्यान से पढ़ता हूं, तो आप "grep से किसी भी और सभी फ़ाइलों के लिए वर्तमान निर्देशिका को खोजने के लिए कहेंगे जिसमें स्ट्रिंग" हैलो "है और केवल .h और .cc फाइलें प्रदर्शित करें"। तो अपनी सटीक आवश्यकताओं को पूरा करने के लिए यहाँ प्रस्तुत है:

यह फ़ाइल नाम प्रदर्शित करता है:

grep -lR hello * | egrep '(cc|h)$'

... और यह फ़ाइल नाम और सामग्री प्रदर्शित करता है:

grep hello `grep -lR hello * | egrep '(cc|h)$'`

2
grep -l hello **/*.{h,cc}

यदि आप shopt -s nullglob.h या no .cc फ़ाइलें नहीं हैं, तो आप त्रुटि संदेशों से बचना चाह सकते हैं ।


4
मुझे पता है कि Google का उपयोग कैसे किया जाता है आदि मैंने इसे यहाँ पूछा क्योंकि कई उत्तरों में "-l" है और एक ही स्थान पर सभी जानकारी होना अच्छा है।
एंड्रयू स्विफ्ट

-l (लोअरकेस "एल") सामान्य उत्पादन को दबा देता है। प्रत्येक इनपुट फ़ाइल का नाम प्रिंट करता है जिसमें से आउटपुट सामान्य रूप से मुद्रित होता है। स्कैनिंग / खोज पहले मैच पर रोक देगा।
रेक्स कूलकोड चार्ल्स

-1

सबसे सरल तरीका: grep -Ril "आपका पाठ" /


1
यह केवल .h या .cc फ़ाइलों को प्रदर्शित नहीं करता है और यह स्पष्ट करना उपयोगी है कि आपने कौन से विकल्पों का उपयोग किया है और क्यों।
कोन साइक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.