আপনি যে সমস্যার মুখোমুখি হচ্ছেন তা হ'ল শেলটি প্রথমে কমান্ড লাইনটি পার্স করে এবং &&অপারেটর দ্বারা পৃথক করা দুটি সহজ কমান্ড দেখায়:, 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"' {} \;।