कैसे खोजें -exec चलाने के लिए?


477

मैं वर्तमान निर्देशिका में उन फ़ाइलों को खोजना चाहता हूं जिनमें पाठ "क्रोम" हो।

$ find . -exec grep chrome
find: missing argument to `-exec'

मैं क्या गलत कर रहा हूं?



मुझे मिलाfind: Only one instance of {} is supported with -exec ... +
कोस्टा

जवाबों:


710

आप एक चूक ;( \;शेल की व्याख्या करने से रोकने के लिए यहां से भाग गए ) या एक +और एक {}:

find . -exec grep chrome {} \;

या

find . -exec grep chrome {} +

findमिल जाएगा grepऔर {}फ़ाइल नाम (ओं) के साथ स्थानापन्न करेगा । के बीच अंतर है ;और +यह है कि प्रत्येक फ़ाइल के लिए ;एक ही grepआदेश के साथ निष्पादित किया +जाता है, जबकि संभव के रूप में कई फ़ाइलों के साथ एक ही grepबार में पैरामीटर के रूप में दिया जाता है ।


30
यदि आप the का उपयोग करते हैं; समाप्ति निर्माण grep को एक बार में एक फ़ाइल पास की जाती है, इसलिए यह फ़ाइल नाम को डिफ़ॉल्ट रूप से प्रदर्शित नहीं करता है, केवल मिलान की गई लाइनें। फ़ाइल सूची प्राप्त करने के लिए grep -ls, खोज निर्माण के अंदर उपयोग जोड़ें ।
कालेब

9
find . -exec grep foo {} +आपको इस तरह से आउटपुट दिखाएगा./dir/file.py:from foo import bar
sg

10
find . -exec grep foo {} \;आपको इस तरह से आउटपुट दिखाएगाfrom foo import bar
sg

9
find . -exec grep -l foo {} +आपको इस तरह से आउटपुट दिखाएगा./dir/file.py
sg

8
find . -exec grep -l foo {} \;आपको इस तरह से आउटपुट दिखाएगा./dir/file.py
sg

46

आपको इसके लिए उपयोग करने की आवश्यकता नहीं है find; grep वर्तमान निर्देशिका में सब कुछ की ग्लोब सूची से फ़ाइलों को खोलने में सक्षम है:

grep chrome *

... या यहां तक ​​कि फ़ोल्डर और इसके तहत सब कुछ के लिए भी पुनरावर्ती:

grep chrome . -R

22
अगर विस्तार ARG_MAX से अधिक हो जाता है तो grep चोक हो जाएगा। -R सब कुछ देखेगा, जबकि एक का उपयोग करके कुछ फ़ाइलों (-name, आदि) को बाहर करने के लिए आसानी से आदिम जोड़ सकते हैं या यहां तक ​​कि सबट्रीज़ (-prune) पर भी नहीं जा सकते।
मेल

6
अच्छे अंक @ मेल। मेरे मुद्दा यह है कि सभी संभावना में पूछ पार्टी चीजों को और अधिक जटिल की तुलना में वे शुरू करने से होने की जरूरत बना रही थी था findजब grepकाम कर सकता है, लेकिन कुछ मामलों में यह बाहर जाने से पहले फ़ाइल सूची ठीक दांते के लिए मिल का उपयोग करने के लिए और अधिक प्रभावी होगा पकड़ना
कालेब

4
@Mel grepऐसे मामले में घुटता नहीं है, execकरता है।
क्रिस डाउन

केवल तभी काम करता है जब सभी फाइलें एक ही डायरेक्टरी में होती हैं, न कि तब जब वे उपनिर्देशिकाओं पर फैली हों।
Yaba

1
@Yaba मेरा उत्तर बताता है कि उपनिर्देशिकाओं पर फैली फ़ाइलों के मामले को कैसे संभालना है।
कालेब

18
find . | xargs grep 'chrome'

आप भी कर सकते हैं:

find . | xargs grep 'chrome' -ls

पहला आपको फाइलों में लाइनें दिखाता है, दूसरा सिर्फ फाइलों को सूचीबद्ध करता है।

कालेब का विकल्प शून्य है, कम कीस्ट्रोक्स।


11
इसके साथ समस्या xargsयह है कि यह अपने इनपुट को एक अजीब तरीके से उद्धृत करने की उम्मीद findकरता है जो उत्पादन नहीं करता है। find … | xargs …यदि आपके पास व्हॉट्सएप या फिर फ़ाइल नाम हैं तो यह काम नहीं करता है \'"
गाइल्स

3
@ गिल्स आप उस समस्या के आसपास कुछ ऐसा इस्तेमाल करके प्राप्त कर सकते हैं find . | xargs -n1 -iX grep "X" 'chrome'जिससे कि तर्क एक समय में एक और खिलाया जा सके। जाहिर है कि इस उदाहरण को संभालने के लिए यह एक बहुत ही अयोग्य तरीका है, लेकिन कुछ स्थितियों के लिए यह अच्छा है।
कालेब

पूर्णता के लिए हमें 'grep' के साथ असंवेदनशीलता के लिए -i विकल्प का भी उल्लेख करना चाहिए। इसके अलावा मामले में असंवेदनशीलता के लिए खोज में नाम है।
मैथ्यू

9
@ कालेब: लिनक्स फिलानेम के xargsसाथ सामना करने के लिए केवल 100% विश्वसनीय तरीका है find ... -print0 | xargs -0, एनयूएल को विभाजक के रूप में उपयोग करना। वैकल्पिक - xargs -d '\n'विभाजक के रूप में न्यूलाइन का उपयोग करना, 99% विश्वसनीयता।
ग्रैविटी

मैं अक्सर इसका उपयोग करता हूं, लेकिन यह फ़ाइल नाम की बहुत लंबी सूची के लिए विफल हो जाएगा, जिस बिंदु पर -exec विजेता बन जाता है।
Spacemoose

5

खोजें एक तरीका है और आप कोशिश कर सकते हैं the_silver_searcherतो आपको बस इतना करना है

ag chrome

यह सभी फाइलों में क्रोम खोजेगा (उप निर्देशिकाओं को शामिल करें) और यह खोजने की तुलना में तेज है


वहाँ भी है pt (प्लैटिनम खोजकर्ता, github.com/monochromegane/the_plinery_searcher पर उपलब्ध है ), जो, IMHO, काम तेजी से करता है - केवल कुछ फाइलें होने पर कोई फर्क नहीं पड़ता।
बनी

1

लाइनों के बजाय फाइलों की सूची देखने के लिए:

grep -l "chrome" *

या:

grep -r -l "chrome" .

1

यहाँ एक उदाहरण है कि मैं आमतौर पर खोज / निष्पादन का उपयोग कैसे करता हूं ...

find  . -name "*.py" -print -exec fgrep hello {} \;

यह सभी .py फ़ाइलों के लिए पुनरावर्ती खोज करता है, और प्रत्येक फ़ाइल प्रिंट (ओं) के लिए फ़ाइल नाम और fgrep के लिए 'हैलो' उस (प्रत्येक के लिए) फ़ाइल पर है। आउटपुट जैसा दिखता है (बस आज एक चला गया):

./r1.py
./cgi-bin/tst1.py
print "hello"
./app/__init__.py
./app/views.py
./app/flask1.py
./run.py
./tst2.py
print "hello again"

1
: अपने कार्यप्रवाह के साथ गड़बड़ है, लेकिन आपको पसंद आ सकते करने के लिए नहीं find . -name "*.py" -exec fgrep -l hello {} \; है कि यह मेल खाते हैं फ़ाइलों के फ़ाइल नाम मुद्रित होगा, और कुछ नहीं -
जेफ स्कालर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.