आप जिस समस्या का सामना कर रहे हैं वह यह है कि शेल पहले कमांड लाइन को पार्स करता है, और &&ऑपरेटर द्वारा अलग किए गए दो सरल कमांड देखता है : find . -iname \*.csv -exec grep foo {}और echo {} \;,। का हवाला देते हुए &&( find . -iname \*.csv -exec grep foo {} '&&' echo {} \;) नजरअंदाज कि है, लेकिन अब आदेश द्वारा निष्पादित findकी तरह कुछ है grepतर्क के साथ foo, wibble.csv, &&, echoऔर wibble.csv। आपको findएक शेल चलाने के लिए निर्देश देने की आवश्यकता है जो &&ऑपरेटर की व्याख्या करेगा :
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
ध्यान दें कि इसके बाद पहला तर्क sh -c SOMECOMMANDहै $0, नहीं $1।
आप कमांड इनवॉइस को समूहीकृत करके हर फ़ाइल के लिए शेल प्रक्रिया के स्टार्टअप समय को बचा सकते हैं -exec … +। प्रसंस्करण में आसानी के लिए, कुछ डमी मूल्य को पास करें $0ताकि "$@"फ़ाइल नामों की गणना हो सके।
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
यदि शेल कमांड केवल दो कार्यक्रमों द्वारा अलग किया गया है &&, तो findअपने आप से काम कर सकते हैं: दो लगातार -execक्रियाएं लिखें , और दूसरा केवल तभी निष्पादित किया जाएगा जब पहले वाला स्थिति 0 से बाहर निकलता है।
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(मुझे लगता है कि grepऔर echoउदाहरण के उद्देश्य के लिए कर रहे हैं, के रूप में -exec echoद्वारा प्रतिस्थापित किया जा सकता है -printऔर परिणामी आउटपुट वैसे भी विशेष रूप से उपयोगी नहीं है।)
-execअनुक्रम में 2 का उपयोग कर सकते हैं या एकल का उपयोग कर सकते हैं-exec sh -c 'grep foo "$0" && printf %s\\n "$0"' {} \;।