रिकॉर्ड के लिए, यहां वह तरीका है जो मुझे पसंद है:
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 को मूल रूप से बहिष्करण प्रदर्शन करना चाहता हूं।