एक ही अंतर्निहित कमांड के साथ उपनिर्देशिकाओं में फ़ाइलों में एक विकल्प ढूंढना?


10

विंडोज में, अगर मैं सभी उपनिर्देशिकाओं में सभी फाइलों में एक स्ट्रिंग ढूंढना चाहता था, तो मैं कुछ ऐसा करूंगा

findstr /C:"the string" /S *.h

हालांकि, लिनक्स (जैसे कि, उबंटू) में मैं से जुड़े कुछ पाइप आदेश के अलावा कोई अन्य रास्ता मिल गया है find, xargsऔर grep(: एक उदाहरण इस पृष्ठ पर है ? मैं कैसे रिकर्सिवली उप-निर्देशिका के माध्यम से grep कर सकते हैं )। हालांकि, मेरा सवाल अलग है: क्या कोई भी ऐसी कोई अंतर्निहित मेक इन कमांड है, जो मेरी शेल स्क्रिप्ट लिखने के बिना, इस जादू से काम करती है?

जवाबों:


19

GNU grep उपनिर्देशिका के माध्यम से पुनरावर्ती खोज करने की अनुमति देता है:

grep -r --include='*.h' 'the string' .

मैंने उबंटू में इस सटीक कमांड लाइन की कोशिश की, लेकिन "grep: अमान्य विकल्प - 'M' प्राप्त करें, हालांकि मैं किसी भी 'M' को कहीं भी नहीं देख सकता ... puzzling
Guido Domenici

@Guido यहाँ पर ठीक काम करता है
phunehehe

एक में सुझाव दिया संपादित TomasG बदलते सिफारिश पिछले *करने के लिए '*': "पिछले वाइल्डकार्ड का हवाला देते हुए बचने त्रुटियों करने की जरूरत है जब साथ कुछ फ़ाइल नाम शुरू होता है -"
माइकल Mrozek

घटनाओं के एक अजीब मोड़ में, यह अब मेरे लिए भी काम करता है, जैसा कि मूल उत्तर में दर्ज किया गया है। धन्यवाद!
Guido Domenici

1
@ गीडो: आपकी समस्या वर्तमान निर्देशिका में फ़ाइल के कारण हो सकती है -Msomething, या GREP_OPTIONSसेटिंग में।
गिल्स एसओ- बुराई को रोकना '

2

grep -r searchpattern /path/to/start/in

वर्तमान निर्देशिका के लिए कहां /path/to/start/in/" ." हो सकता है ।


1

नंबर find -name \*.h -print0 | xargs -0 grep -l 'the regex'उतना ही जादू है जितना कि यह मिलता है।


GNU grep में इसके -rविकल्प के साथ निर्मित सामान्य मामले हैं । भारी तोपखाने की जरूरत नहीं।
गिल्स एसओ- बुराई को रोकना '

3
xargsसिर्फ शोर जोड़ता है। उपयोग करेंfind -name \*.h -execdir grep -l 'the regex {} +
उपयोगकर्ता अज्ञात

0

क्या कोई एकल, अंतर्निहित कमांड है जो इस जादू के माध्यम से काम करता है ...?

पांडित्यपूर्ण होने के लिए, नहीं, आप यह नहीं मान सकते हैं कि ऐसी कोई कमांड मौजूद है

यूनिक्स के कई अलग-अलग कार्यान्वयन हैं, और प्रत्येक के पास अलग-अलग quirks हैं। POSIX, सामान्य भाजक (और यूनियनों के एक मानक के लिए निकटतम चीज) इस तरह के विकल्प को निर्दिष्ट नहीं करता हैgrep

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, जीएनयू के कार्यान्वयन grepमें एक गैर-मानक विकल्प है जो वह करता है जो आप चाहते हैं। हालांकि यह विशेष कार्यान्वयन लिनक्स सिस्टम पर आम हो सकता है, आप किसी भी यूनिक्स, यहां तक ​​कि कुछ लिनक्स सिस्टम पर इसकी उपलब्धता को नहीं मान सकते।

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

आपके मामले में, फ़ाइल सिस्टम को क्रॉल करना और स्ट्रीम में regexp से मेल खाना दो अलग-अलग कार्य हैं। एक अलग कार्यक्रम में प्रत्येक का इलाज करना सामान्य है।


0

नीचे दी गई निर्देशिका से स्ट्रिंग खोजने के लिए कमांड के नीचे उपयोग करें

find <fullDirectoryPath> -name '*' -exec grep -l '<StringToFind>' {} \;

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

find /apps_bev/apps/xfer/export/02210 -name '*' -exec grep -l '38221000001032' {} \;

1
grepतर्कों के रूप में एक से अधिक फ़ाइल ले सकते हैं, इसलिए आपको प्रति फ़ाइल एक मंगलाचरण चलाने से बचने के +बजाय उपयोग करना चाहिए जो काफी अक्षम है। \;grep
स्टीफन चेज़लस

1
ध्यान दें कि -name '*'उन फ़ाइलों को प्रतिबंधित करता है जिनका नाम वर्तमान पाठ में मान्य पाठ है (कुछ findकार्यान्वयन में कम से कम), लेकिन अन्य निर्देशिका घटकों में अभी भी बाइट्स के अनुक्रम हो सकते हैं जो वैध वर्ण नहीं बनाते हैं। यदि आपका इरादा -name '*'यह सुनिश्चित करने का था कि आउटपुट मान्य पाठ है (अनुचित नामों के साथ फ़ाइलों को छोड़ कर), तो आप इसका उपयोग find ... ! -name '*' -prune -o -exec grep ... {} +करेंगे, जो findअनुचित नामों के साथ निर्देशिकाओं में उतरने से भी रोक देगा ।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.