आप जिस समस्या का सामना कर रहे हैं वह यह है कि शेल पहले कमांड लाइन को पार्स करता है, और &&
ऑपरेटर द्वारा अलग किए गए दो सरल कमांड देखता है : 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"' {} \;
।