बैश xargs को केवल एक घटना के रूप में पाते हैं


16

शायद यह थोड़ा अजीब है - और शायद ऐसा करने के लिए अन्य उपकरण भी हैं, लेकिन ..

मैं उन सभी फ़ाइलों को खोजने के लिए निम्नलिखित क्लासिक बैश कमांड का उपयोग कर रहा हूं जिनमें कुछ स्ट्रिंग हैं:

find . -type f | xargs grep "something"

मेरे पास बड़ी संख्या में फ़ाइलें हैं, कई गहराइयों पर। "कुछ" की पहली घटना मेरे लिए पर्याप्त है, लेकिन खोज जारी है, और बाकी फ़ाइलों को पूरा करने में लंबा समय लगता है। मैं ऐसा करने के लिए वापस grep से एक "प्रतिक्रिया" की तरह कुछ करना चाहता हूं ताकि खोज अधिक फ़ाइलों के लिए खोज करना बंद कर सके। क्या ऐसा करना संभव है?

जवाबों:


20

बस इसे खोजने के दायरे में रखें:

find . -type f -exec grep "something" {} \; -quit

यह इस तरह काम करता है:

-execकाम जब होगा -type fसच हो जाएगा। और क्योंकि grepरिटर्न 0(सफलता / सच) जब -exec grep "something"एक मैच है, तो -quitट्रिगर हो जाएगा।


8
find -type f | xargs grep e | head -1

वास्तव में ऐसा करता है: जब headसमाप्त होता है, तो पाइप के मध्य तत्व को 'टूटी हुई पाइप' सिग्नल के साथ सूचित किया जाता है, बदले में समाप्त होता है, और सूचित करता है find। आपको एक नोटिस देखना चाहिए जैसे कि

xargs: grep: terminated by signal 13

जो इस बात की पुष्टि करता है।


+1 स्पष्टीकरण और विकल्प के लिए, हालांकि दूसरा जवाब मुझे अधिक सुरुचिपूर्ण लगता है, क्योंकि यह अधिक आत्मनिर्भर है
हेलो_अर्थ

8

उपकरण बदलने के बिना ऐसा करने के लिए: (मुझे xargs से प्यार है)

#!/bin/bash
find . -type f |
    # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20
    # grep -m1: show just on match per file
    # grep --line-buffered: multiple matches from independent grep processes
    #      will not be interleaved
    xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >(
        # Error output (stderr) is redirected to this command.
        # We ignore this particular error, and send any others back to stderr.
        grep -v '^xargs: .*: terminated by signal 13$' >&2
    ) |
    # Little known fact: all `head` does is send signal 13 after n lines.
    head -n 1

1
+1 कभी नहीं पता था कि xargs में ऐसी मल्टीटास्किंग क्षमताएं होंगी - अन्य टिप्पणियों के लिए भी धन्यवाद! :)
hello_earth
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.