আমি যে জিনিসগুলি পেয়েছি তার উপর একাধিক কমান্ড চালানোর চেষ্টা করছি, কীভাবে আমি এটি অর্জন করতে পারি?
find . -exec cmd1; cmd2
কাজ করে বলে মনে হয় না; এটি পরিবর্তে cmd2 সঞ্চালিত হয় প্রতিটি ফাইলের উপর cmd1 নির্বাহের পরে।
আমি যে জিনিসগুলি পেয়েছি তার উপর একাধিক কমান্ড চালানোর চেষ্টা করছি, কীভাবে আমি এটি অর্জন করতে পারি?
find . -exec cmd1; cmd2
কাজ করে বলে মনে হয় না; এটি পরিবর্তে cmd2 সঞ্চালিত হয় প্রতিটি ফাইলের উপর cmd1 নির্বাহের পরে।
উত্তর:
এই প্রদর্শনীতে, আমি প্রথমটির জন্য sh -c 'echo first; false'
(বা true
) ব্যবহার করব -exec
। এটি কিছু আউটপুট দেবে এবং নির্বাচিত প্রস্থান কোডের প্রভাবও ফেলবে। তারপরে echo second
দ্বিতীয়টির জন্য ব্যবহৃত হবে। ধরে নিন যে বর্তমান ডিরেক্টরিতে একটি ফাইল আছে।
$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
এই ধরণের সত্যিকারের আদেশটি দেখতে পাবেন:
find . -type f \( -exec command1 \; -false -o -exec command2 \; \)
দ্বিতীয় সেটে, পালানো বন্ধনী দুটি -exec
দফা গ্রুপ করেছে । -false
তাদের মধ্যে "FALSE" এবং পরীক্ষা রাষ্ট্র বাধ্য করে -o
কারণ পরবর্তী অভিব্যক্তি (দ্বিতীয় -exec
) কারণ মূল্যায়ন করা -false
।
থেকে man find
:
expr1 expr2 পর পর
দুটি অভিব্যক্তি একটি অন্তর্ভুক্ত "এবং" এর সাথে যোগ দিতে নেওয়া হয়; expr1 টি মিথ্যা হলে expr2 মূল্যায়ন করা হয় না।expr1 -a expr2
expr1 expr2 হিসাবে একই।expr1 -o expr2
বা; expr1 টি সত্য হলে expr2 মূল্যায়ন করা হয় না।
আপনি যদি ত্রুটি কোডের কারণে সেমিডিডি 2 চালানো থেকে প্রতিরোধ করতে সক্ষম হন সে বিষয়ে সিডিডি 1 সক্ষম না হও 0
:
find . -exec cmd1 \; -exec cmd2 \;
সর্বদা এটি চালানোর জন্য উভয় কমান্ড পাওয়ার একমাত্র নির্ভরযোগ্য উপায় হ'ল find
শেলটি আহরণ করা যা পরবর্তীকালে কমান্ডগুলি ধারাবাহিকভাবে চালিত করে:
find . -exec bash -c 'cmd1; cmd2' filedumper {} \;
আপনি যদি কোনও স্ক্রিপ্ট তৈরি করতে আপত্তি করেন না যা cmd1 এবং cmd2 করে, তবে এটি কেবল এটি:
find . -exec myscript {} \;
অথবা
find . -exec myscript {} +
ব্যবহার করুন \; অথবা + একবারে ম্যাসক্রিপ্ট একাধিক ফাইল হ্যান্ডেল করতে পারে কিনা তার উপর নির্ভর করে (ফাইলের নাম ইত্যাদিতে ফাঁক থাকলে লোমশ হয়)।
আপনি আমার স্ক্রিপ্টে যা যা করছিলেন তা আমার অভিজ্ঞতা অনুসারে রাখার বিষয়টি প্রায় সর্বদা সার্থক ছিল। যদি একবার এটি করতে হয় তবে আপনাকে এটি আবার করতে হবে।
তবে একটি ঝরঝরে কৌশল হ'ল স্ক্রিপ্টটির ভিতরে থাকা:
if [ $# -gt 0 ]; then
for each; do
touch $each
done
else
find . -exec $0 {} +
fi
তারপরে ম্যাসক্রিপ্ট আপনি যে ফাইলগুলিতে কাজ করেন তার পক্ষে আর্গুমেন্ট হিসাবে কাজ করে তবে আপনি যদি কোনও যুক্তি না দেন তবে এটি বর্তমান দির থেকে খুঁজে পাওয়া যায় এবং তারপরে সন্ধান করা ফাইলগুলিতে নিজেকে কল করে। এটি এই সত্যটির চারপাশে আসে যে সন্ধান করুন-এক্সেক আপনার স্ক্রিপ্টে সংজ্ঞায়িত শেল ফাংশনগুলি কল করতে পারে না।
আমি অনেক ভাগ্য ছাড়াই পূর্ববর্তী উভয় সমাধান চেষ্টা করে যাচ্ছি। এই একজন আমার পক্ষে সুন্দরভাবে কাজ করেছেন:
$ for i in `find . -exec echo {} \;`; do cmd1 $i; cmd2 $i; done
-o
।