रिकॉर्ड के लिए, यहां वह तरीका है जो मुझे पसंद है:
grep pattern $(find . -type f ! -path './test/main.cpp')
grepकमांड की शुरुआत में रखने से , मुझे लगता है कि यह थोड़ा और स्पष्ट है - साथ ही यह grepरंग हाइलाइटिंग को अक्षम नहीं करता है । एक अर्थ में, findकमांड-प्रतिस्थापन में उपयोग करना (सीमित) फाइल-सर्च सब्मिट की जगह को बढ़ाने / बदलने का एक तरीका है grep।
मेरे लिए, find -execवाक्यविन्यास एक प्रकार का पुरालेख है। find -exec(कभी-कभी) विभिन्न पात्रों से बचने के लिए (कभी-कभी यदि \;बैश के तहत उपयोग किया जाता है ) एक जटिलता की आवश्यकता होती है। बस चीजों को परिचित संदर्भों में रखने के प्रयोजनों के लिए, निम्नलिखित दो आदेश मूल रूप से समतुल्य हैं:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
यदि आप उपनिर्देशिका को बाहर करना चाहते हैं , तो वाइल्डकार्ड का उपयोग करना आवश्यक हो सकता है। मैं यहां स्कीमा को पूरी तरह से नहीं समझता - आर्कन के बारे में बात करता हूं :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
स्क्रिप्ट्स में उपयोग के लिए सामान्यीकृत findसमाधान के लिए एक और ध्यान दें : grepकमांड-लाइन में -H/ --with-filenameविकल्प शामिल होना चाहिए । अन्यथा यह इस परिस्थिति में आउटपुट स्वरूपण को बदल देगा कि खोज परिणामों में केवल एक फ़ाइल नाम होता है find। यह उल्लेखनीय है क्योंकि यह grepदेशी फ़ाइल-खोज ( -rविकल्प के साथ ) का उपयोग करने के लिए आवश्यक प्रतीत नहीं होता है ।
... इससे भी बेहतर, हालांकि, /dev/nullखोज के लिए पहली फ़ाइल के रूप में शामिल है । यह दो समस्याओं को हल करता है:
- यह सुनिश्चित करता है कि अगर खोज करने के लिए एक फ़ाइल है,
grepतो सोचेंगे कि दो हैं और कई-फाइल आउटपुट मोड का उपयोग करें।
- यह सुनिश्चित करता है कि अगर खोज करने के लिए कोई फाइल नहीं है,
grepतो सोचेंगे कि एक फाइल है और स्टड पर लटका नहीं है।
तो अंतिम उत्तर है:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir) को बाहर करना चाहता हूं तो समस्या बढ़ जाती है । इसलिए मैं grep को मूल रूप से बहिष्करण प्रदर्शन करना चाहता हूं।