मैं "grep: तर्क सूची बहुत लंबी" त्रुटि से कैसे बच सकता हूं?


7

मैं मैक 10.7.5 का उपयोग कर रहा हूं और बैश शेल पर। मैं फ़ाइलों के एक समूह में एक स्ट्रिंग के उदाहरण खोजने की कोशिश कर रहा हूं, लेकिन यह त्रुटि मिलती रहेगी

Daves-MacBook-Pro:folder davea$ find . -name "*" | xargs grep 'state-icons'
xargs: grep: Argument list too long

मैं इस त्रुटि से बचने के लिए कमांड (या एक समान) कैसे चला सकता हूं?


grep '...' <( find … )शायद?
16

जवाबों:


7

आप तर्कों की संख्या को सीमित करने के -nविकल्प का उपयोग कर सकते हैं xargs

find . -name "*" | xargs -n 20 grep 'state-icons'

ध्यान दें कि यह उनके नाम की व्हाट्सएप वाली फाइलों के लिए काम नहीं करता है।


3
यह उनके नाम पर रिक्त स्थान वाली फाइलों के लिए काम करता है। यह केवल उनके नाम की नई फाइलों वाली फाइलों के लिए विफल रहता है, जो बहुत दुर्लभ हैं।
रिसी

क्या तर्कों की संख्या को सीमित करने से सही परिणामों को प्रदर्शित होने से रोका जा सकेगा? अंततः मेरा लक्ष्य वांछित स्ट्रिंग के उदाहरण के साथ फाइलें ढूंढना है, जैसा कि त्रुटि संदेश को समाप्त करने के विपरीत है।
डेव

@Dave: नहीं, grepकई बार चलाया जाएगा, जिसमें 20 फ़ाइल तर्क होंगे। निर्देशिकाओं को खोलने का प्रयास करने पर आप त्रुटियों से बचने के -type fलिए जोड़ सकते हैं । findgrep
choroba

2
एक जोखिम है कि यदि findरिपोर्ट, कहती है, 61 फाइलें, तो चार बार xargsचलेगी grep-तीन बार 20 फाइलों के साथ और एक बार 1 फाइल के साथ। जब grepकई फ़ाइलों के साथ चलाया जाता है, तो यह फ़ाइल के नाम (नों) को रिपोर्ट करता है जहां यह मैच पाता है; केवल एक फ़ाइल नाम तर्क के साथ ऐसा नहीं है। एक ट्रिक जिसे आमतौर पर इसे ठीक करने के लिए उपयोग किया जाता है xargs -n 20 grep 'state-icons' /dev/null, इसलिए xargsयह grep21 फ़ाइलों के साथ तीन बार चलेगी और एक बार 2 फ़ाइलों के साथ-अतिरिक्त फ़ाइल, निश्चित रूप से, होने पर /dev/null, जो अन्यथा रन पर कोई प्रभाव नहीं डालेगी।
स्कॉट

2
@ सेट: आप (यदि समर्थित हो) के -Hविकल्प का भी उपयोग कर सकते हैं grep
कोरोबा

-2

इस के बारे में क्या अगर आप फ़ाइल नाम के माध्यम से खोज करना चाहते हैं :

for x in ./**/*.*; do echo "$x" | grep 'state-icons' ; done

और यदि आप फ़ाइल सामग्री के माध्यम से खोज करना चाहते हैं :

for x in ./**/*.*; do grep 'state-icons' "$x" ; done

1
यह grepकेवल फ़ाइल नामों पर चलेगा , न कि उनकी सामग्री पर। इसके अलावा, *.*"सभी फ़ाइलों" (जैसा कि यह विंडोज में करता है) का मतलब नहीं है; यह उन फ़ाइलों को खोज को प्रतिबंधित करता .है जिनके नाम में ए है।
स्कॉट

@ सही लेकिन -nameतर्क इंगित करता है कि वे फ़ाइल नाम के बारे में खोज करना चाहते हैं। यदि वे फ़ाइल सामग्री के बारे में खोज करना चाहते हैं, तो केवल echoउपयोग और उपयोग को छोड़ देंgrep 'state-icons' $x
youkaichao

कृपया उस विविधता को शामिल करने के लिए अपने उत्तर को संपादित करें। ओह, और मैं लगभग भूल गया: कृपया अपने चर का उद्धरण करें।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.