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