পাওয়া ফাইলের ডিরেক্টরিতে (বর্তমান ডিরেক্টরি নয়) ডিরেক্টরিতে কমান্ড কার্যকর করতে কীভাবে `find -exec` ব্যবহার করবেন?


15

আসুন আমি একটি ডিরেক্টরি যা কিছু সাবডিরেক্টরি আছে, আছি dir1, dir2এবং dir3। এই ডিরেক্টরিগুলির প্রত্যেকটির একটি ফাইল রয়েছে fooএবং আমি প্রতিটি fooডিরেক্টরিতে প্রতিটি একই কমান্ড চালাতে চাই এবং সেই কমান্ডটি সেই ডিরেক্টরিটির ভিতরে থেকে কার্যকর করাতে চাই।

যদি আমি এটি "হাত ধরে" করি, তবে এটির মতো দেখতে লাগবে:

cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)

কমান্ডটি প্রতিটি ডিরেক্টরি থেকে কার্যকর করা আবশ্যক । fooএটি একটি ব্যাচের শিডিউলিং স্ক্রিপ্ট (এইচটিসিওনডোরের জন্য, যদি আপনি জানতে আগ্রহী হন) এবং প্রতিটি সাব-ডিরেক্টরি থেকে অবশ্যই নির্বাহ করা উচিত যাতে শিডিয়ুলিং স্ক্রিপ্টগুলি দ্বারা শুরু হওয়া রানগুলির আউটপুট প্রতিটি উপ-ডিরেক্টরিতে শেষ হয়।

যতক্ষণ আমি বলতে পারি, " একটি ফাইল সন্ধান করুন এবং ফাইলের ডিরেক্টরিতে একটি আদেশ সন্ধান করুন " প্রশ্নটি আমার প্রশ্নের উত্তর দেয় না। এই প্রশ্নের প্রথম উত্তরটি একটি কাজের দিক থেকে বেশি যা আমার ক্ষেত্রে কাজ করবে না এবং দ্বিতীয় উত্তরটিতে কীভাবে এটি ব্যবহার করতে হয় তা জানতে আমার পক্ষে যথেষ্ট ব্যাখ্যা নেই।


@ রাইমা, দয়া করে এটি কীভাবে সদৃশ তা ব্যাখ্যা করুন। এই প্রশ্নের প্রথম উত্তরটি আমাকে সাহায্য করে না , এটি প্রায় আরও কাজ এবং দ্বিতীয় উত্তরটি আমার কোনও অর্থ দেয় না। এটি কীভাবে ব্যবহার করতে হয় তা জানতে আমার আরও ব্যাখ্যা প্রয়োজন।
নিউট্রনস্টার

উত্তর:


23

আপনার সমর্থনগুলি ধরে নিয়ে find, -execdirপরিবর্তে বিকল্পটি ব্যবহার করুন-exec

find * -name 'foo' -execdir pwd \;

যদি তা না হয় তবে দয়া করে আপনার প্ল্যাটফর্ম এবং / অথবা বিতরণের বিশদ সরবরাহ করুন (যথাযথ হিসাবে)।


যখন আপনি "সন্ধান করুন: আপেক্ষিক পথ './node_modules/.bin' PATH পরিবেশের পরিবর্তনশীলের অন্তর্ভুক্ত রয়েছে,": জিজ্ঞাসুবন্টু
সিওরো সান্তিলি 冠状 病毒 审查 六四 事件 法轮功

দুঃখিত, আমি যদি এটি লিখতে পারি তবে, তবে -উক্তচির (উবুন্টুতে) বিষ্ঠা, কারণ এটি আপনাকে দেয় না {}, তবে এর পিতামাতা {}
uav

1
@ uav আপনার ব্যবহারের বিষয়টি না জেনে আমি আপনাকে সহায়তা করতে পারি না। কিন্তু আপনার whinge ডকুমেন্টেশন স্পষ্টভাবে "জবাবে মতো -exec, কিন্তু নিদিষ্ট কমান্ড মিলেছে ফাইল ধারণকারী সাব থেকে চালানো হয় "।
রোয়াইমা

হ্যাঁ, ঠিক আছে, আপনি-টাইপ ডি (= ডিরেক্টরি) সন্ধান করছেন এবং তারপরে এটি সর্বোত্তম mal
uav

আপনার ব্যবহারের বিষয়টি না জেনে আমি আপনাকে সাহায্য করতে পারি না।
রোয়াইমা

4

ধরে নিচ্ছি যে আপনার কমান্ডটি পরিচালনা করতে ঠিক কোন ডিরেক্টরিগুলি জেনেছেন,

for dir in dir1 dir2 dir3; do
    ( cd "$dir" && somecommand foo )
done

বা, fooফাইলগুলি লুপিং ,

for foo in */foo; do
  ( cd "${foo%/*}" && somecommand foo )
done

সাবস্কেলটি cdস্ক্রিপ্টের বাকী অংশের কাজের ডিরেক্টরিকে প্রভাবিত করতে বাধা দেয় । ${foo%/*}চিহ্নিত ডিরেক্টরির মধ্যে নাম পরামিতি প্রতিকল্পন বিস্তৃতি fooফাইল বসবাস (শেষ পর সবকিছু সরিয়ে /মূল্য $foo)।

findএকই জিনিসটি করার জন্য স্ট্যান্ডার্ড ব্যবহার করে (যে ক্ষেত্রে fooফাইলগুলি ডিরেক্টরি কাঠামোর গভীরে থাকতে পারে):

find . -type f -name foo -exec sh -c '
    for foo do
        ( cd "${foo%/*}" && somecommand foo )
    done' sh {} +

কথায় আছে: বর্তমান ডিরেক্টরি বা নীচে যে কোনও জায়গায় "foo" নামক নিয়মিত ফাইলগুলি সন্ধান করুন এবং ব্যাচগুলিতে এই শেল স্ক্রিপ্টে তাদের পথের নাম দিন। শেল স্ক্রিপ্ট প্রদত্ত পথের নামগুলি দিয়ে পুনরাবৃত্তি করবে, প্রতিটি পথের নামের অংশে ডিরেক্টরি পরিবর্তন করবে এবং যদি এটি সফল হয় তবে সম্পাদন করুন somecommand foo

নন স্ট্যান্ডার্ড ব্যবহার করে এমন কোনও সমাধানের জন্য -execdir, রইমার উত্তর দেখুন । তার উত্তরটি আমার উদাহরণের সাথে খাপ খাইয়ে নিয়েছে:

find . -type f -name foo -execdir somecommand foo ';'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.