একাধিক ডিরেক্টরিতে ফাইলগুলি কার্যকর করতে স্ক্রিপ্ট কীভাবে লিখবেন


4

একাধিক ডিরেক্টরিতে ফাইলগুলি কার্যকর করতে আমি কীভাবে স্ক্রিপ্ট লিখব?

সমস্যাটি হ'ল আমার অনেক ডিরেক্টরি রয়েছে এবং প্রত্যেকের কাছে পাইথন স্ক্রিপ্টটি (বলে, a.py) পড়তে ও বিশ্লেষণ করার জন্য একটি ডেটা ফাইল রয়েছে । আমি প্রতিটি ডিরেক্টরিতে "সিডি" করতে চাই না এবং "এপিপি" টাইপ করতে চাই না। প্রতিটি ডিরেক্টরিতে আউটপুট সংরক্ষণ করা হয়।

উত্তর:


8

find আপনার জন্য যাদু কাজ করবে।

find -name datafile.dat -execdir ~/a.py '{}' \;

নিয়মের একটি সেট মেলে এবং সেগুলিতে একটি ক্রিয়া সম্পাদন করে এমন ফাইলগুলির জন্য সমস্ত উপ-ডিরেক্টরিতে পুনরাবৃত্তি অনুসন্ধান করুন।

-নম-এর নিয়ম আপনাকে এমন কোনও নামের সাথে ফাইলগুলি সন্ধান করতে দেবে যা আপনি এটি দিয়ে দেন তার সাথে মেলে। আপনি গ্লোববিং ব্যবহার করতে পারেন, উদাহরণস্বরূপ, "* .dat" সমস্ত .dat ফাইল খুঁজে পেতে পারে।

যদি প্রয়োজন হয়, আপনি গ্লোব প্যাটার্নের পরিবর্তে একটি রেগেক্স প্যাটার্নের সাথে মেলানোর জন্য--এর পরিবর্তে -regex ব্যবহার করতে পারেন, তাই আপনি সমস্ত .dat ফাইলের সাথে মিল রাখতে "। * \। ড্যাট $" করতে পারেন।

-Execdir পাওয়া ফাইলের ডিরেক্টরি থেকে আপনি যা আদেশ দিন তা কার্যকর করে, "{}" এর পরিবর্তে পাওয়া ফাইলের পরিবর্তে।


খুশী হলাম। আমার সত্যই শিখতে হবে find, এতে প্রতিটি কল্পনাযোগ্য পরিস্থিতিতে পতাকা রয়েছে
মাইকেল মরোজেক

সন্ধানের জন্য ম্যান পৃষ্ঠাটি দুর্দান্ত নয় তবে তথ্য পৃষ্ঠাগুলি বিস্তৃত।
শন জে গফ

1
@ মিশেল: জেডশির একই বৈশিষ্ট্য রয়েছে; এগুলি আরও ক্রিপ্টিক তবে টাইপিং কম। @ শ্যাশন: -execdirদরকারী, তবে বহনযোগ্য নয়। @ সমস্ত: বাশ 4 বা zsh এ আপনি করতে পারেনfor x in **/datafile.dat; do (cd "$(dirname "$x")" && ~/a.py "$(basename "$x")"); done
গিলস

7

আপনি সম্ভবত একটি forলুপ ব্যবহার করতে পারেন :

for i in first_dir second_dir third_dir; do
    pushd $i
    a.py
    popd
done

এটা তোলে চালানো হবে pushd $i; a.py; popdসঙ্গে $iসেট first_dirকরুন, তারপর আবার সঙ্গে $iযেমন second_dir, এবং পরিশেষে $iযেমন third_dirpushdপ্রদত্ত ডিরেক্টরিতে popdস্যুইচ করে এবং আপনি যেখানে ছিলেন সেখানে ফিরে যায়


3
পুশড এবং পপডের পরিবর্তে আপনি একটি সাব-শেল ব্যবহার করতে পারেন - (cd $i && a.py)। এই কনস্ট্রাক্টটি existing আমি বিদ্যমান না থেকেও রক্ষা করে - পুশড কাজ না করলে আপনি পপড করতে চান না।
ক্যামহহ

3
@ মিশেল, @ ক্যাম, @ সিনিয়েও: সবসময় পরিবর্তনশীল বিকল্পের চারপাশে ডাবল কোট রাখুন। , যেমন cd -- "$i"। এছাড়াও, ফাইলের নামের আগে -পাস দিয়ে ফাইলগুলির বিরুদ্ধে কমান্ডগুলি সুরক্ষিত --করুন।
গিলস

2
ঠিক আছে, সর্বদা মতামতটি সঠিক, তবে আমি স্মরণ করতে পারি না আমি শেষবারের মতো ছোট্ট একটি শেল স্নিপেট পোস্ট করেছি যাতে কারও মতো এরকম কিছু নিয়ে মন্তব্য করা না হয় - আপনি ছেলেরা কি এই সমস্ত অপ্রয়োজনীয়তাগুলি অন্তর্নির্মিতভাবে সিরিয়াসভাবে লিখেছেন? আপনি বিদ্যমান নেই এমন ডিরেক্টরিগুলি থেকে রক্ষা করছেন বা স্থান নেই বা ড্যাশ দিয়ে শুরু করছেন যেমন এটি নির্বিচারে ইনপুট গ্রহণ করা প্রয়োজন; লুপের জন্য এটি এক সময়ের যা স্থির অ্যারে "ফার্স্ট_ডির সেকেন্ড_ডির তৃতীয়_দীর" এর উপরে পুনরাবৃত্তি করে - সেই জিনিসগুলির মধ্যে
কোনওটিই

2
@ মিশেল: আমি আমার সর্বজনীন পোস্টগুলিতে যথাযথ উদ্ধৃতি এবং যথাযথ সাধারণীকরণ অন্তর্ভুক্ত করার চেষ্টা করি। আমি জানতে পারি না যখন কেউ এলোমেলো পাঠক একটি উত্তরের কিছুটা বিস্তৃত প্রবন্ধে অনুলিপি করতে চলেছেন যা (পাঠকের অজানা) মূল প্রেক্ষাপট থেকে একেবারেই আলাদা। উদ্ধৃতি এবং অন্যান্য জেনারালাইজেশন কৌশলগুলি ব্যবহার করে পরিস্থিতিগুলির প্রশস্ততা প্রসারিত করতে পারে যেখানে কোনও প্রদত্ত কোড স্নিপেট সঠিকভাবে প্রয়োগ করা যেতে পারে। আমি আমার ইন্টারেক্টিভ ব্যবহারে যথাযথ উদ্ধৃতি ইত্যাদি ব্যবহার করতে পছন্দ করি যেহেতু আমি দেখতে পেয়েছি যে এই ধরনের অনুশীলনগুলি অভ্যাস তৈরি করে যা পুরো শেল প্রোগ্রামগুলি লেখার সময় আমার উপকার করে।
ক্রিস জনসন

1
@ মিশেল: আমি ক্রিসের সাথে পুরোপুরি একমত; আমি এমনকি ওয়ান-লাইনারে উদ্ধৃতি দেওয়ার এবং &&যখন সম্ভব তখন ব্যবহার করার অভ্যাস করছি কারণ আপনি কখনই বুঝতে পারবেন না যে আপনি কোনও কিছুর মধ্যে কোনও জায়গা ভুলে যাবেন বা কোনও টাইপ তৈরি করে কী কমান্ড ব্যর্থ হতে পারে এবং কখন নির্ভর করে এটি আপনাকে কামড়ায়, আপনি উদ্ঘাটিত হতে পারে।
ক্যাসকেবেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.