2013-02-11 54 views
7

सभी फ़ाइलें "foo" वर्तमान फ़ोल्डर में शामिल ढूंढने के लिए शामिल नहीं है का पता लगाएं, मैं का उपयोग करें:फ़ाइलों को एक स्ट्रिंग

grep -r "foo" . 

सभी फ़ाइलें वर्तमान फ़ोल्डर में "बार" शामिल ढूंढने के लिए, मैं उपयोग करें:

grep -r "bar" . 

लेकिन उन सभी फ़ाइलों को कैसे ढूंढें जिनमें 'foo' और 'bar' नहीं है?

उत्तर

13

लाइनों कि कुछ स्ट्रिंग शामिल नहीं है मुद्रित करने के लिए, आप -v ध्वज का उपयोग करें:

grep -r -v "bar" . | grep -v "foo" 

यह आप सभी लाइनों है कि देता नहींfoo या bar होते हैं।

फ़ाइलों को प्रिंट करने के लिए जिसमें कुछ स्ट्रिंग नहीं है, आप -L ध्वज का उपयोग करते हैं।

grep -r -L -P "(foo|bar)" . 

यह फ़ाइलों को foo या bar शामिल नहीं है की एक सूची प्रिंट: गैर मैच कई तार के लिए, आपको -P ध्वज के साथ रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं (वहाँ कई regex झंडे आप उपयोग कर सकते हैं)।

इस बिंदु को इंगित करने के लिए Anton Kovalenko पर धन्यवाद।

+3

गलत होता है के लिए निर्देशिका खोज करता है। '-v' गैर मेल खाने वाली लाइनों के बारे में है, न कि * मेल खाने वाली रेखाएं अनुपस्थित हैं *। –

+0

@ एंटोनकोवलेंको आप सही हैं, मैंने पाइप में '-r' हटा दिया है। "गैर मिलान वाली रेखाओं" के लिए, ओपी यही मांग रहा है: 'grep -v "foo" उन पंक्तियों को प्रदान करता है जो' foo' से मेल नहीं खाते हैं। – alestanis

+0

वह उन फाइलों के बारे में पूछता है जिनमें * * foo और bar * शामिल नहीं हैं *, उन फ़ाइलों के बारे में नहीं जिनमें * कुछ गैर-बार लाइनें और कुछ गैर-फू लाइनें * शामिल हैं। –

1
awk साथ

, कुछ की तरह:

awk 'BEGIN {f=ARGV[1] ; ff=0} f != FILENAME { if (ff>0) { print f } ; ff=0 ; f=FILENAME } /SEARCHSTRING/ {ff=1} END {if (ff>0) { print f } }' INPUT_FILE_LIST(PATTERN) 

मूल रूप से यह हर इनपुट फ़ाइल पढ़ता है और अगर देखता है अपने SEARCHSTRING (जो एक regex हो सकता है), यह है कि जानकारी की बचत होती है। वर्तमान फ़ाइल (या अंतिम फ़ाइल के बाद) को खत्म करने के बाद, जांचें कि क्या उसे कुछ मिला है, और यदि ऐसा है, तो पिछले फ़ाइल नाम मुद्रित करें।

1

नीचे आज़माएं। यह

grep -rL -P "(foo | bar)" काम करना चाहिए।

3

इस एक का प्रयास करें:

grep -L -e "foo\|bar" * 
1

रिकर्सिवली सभी फाइलों को ऐसा कोई XYZ

find . -type f | xargs grep -L "XYZ"