প্রতিটি মিলে যাওয়া ফাইলের জন্য (অর্থাত্ প্রতিটি ডিরেক্টরি), find
সেই ডিরেক্টরিটিতে স্যুইচ করে (যেমন এর মূল ডিরেক্টরি) এবং নির্দিষ্ট কমান্ডটি কার্যকর করে। যেহেতু কমান্ডটি ম্যাচের নাম ব্যবহার করে না, তাই এটি কখনই সমস্ত ডিরেক্টরিতে কাজ করে না। এই বিশেষ ডিরেক্টরি ট্রি জন্য, আপনি করছেন
(cd . && touch foo) # because ./a matches
(cd ./a && touch foo) # because ./a/b matches
(cd ./a/b && touch foo) # because ./a/b/c matches
প্রতিটি ডিরেক্টরিতে একটি ফাইল তৈরি করতে, আপনি তার -exec
পরিবর্তে কেবলমাত্র যুক্তিটির ভিতরে -execdir
প্রয়োগের find
অনুমতি প্রদানের পরিবর্তে ব্যবহার করতে পারেন {}
(বেশিরভাগ ক্ষেত্রে এবং বিশেষত আমি মনে করি সমস্তগুলি):
find . -type d -exec touch {}/foo +
পসিক্স বহনযোগ্যতার জন্য আপনাকে নিজেরাই ডিরেক্টরী নাম এবং ফাইলের নামের নাম একত্রিত করতে হবে do
find . -type d -exec sh -c 'touch "$0/foo"' {} \;
বা (কিছুটা দ্রুত)
find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +
বিকল্পভাবে, আপনি ব্যাশের পুনরাবৃত্তি ওয়াইল্ডকার্ড ম্যাচটি ব্যবহার করতে পারেন। সাবধান থাকুন (ksh এবং zsh এ সম্পর্কিত বৈশিষ্ট্যটির বিপরীতে এবং আপনার find
আদেশের বিপরীতে ) বাশ ডিরেক্টরিগুলির প্রতীকী লিঙ্কগুলিতে পুনরাবৃত্তি করে।
shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done
একটি zsh সমাধান:
touch ./**/(e\''REPLY+=foo'\')
man bash
"-সি" এর অধীনে রাজ্যগুলি: কমান্ড_ স্ট্রিংয়ের পরে আর্গুমেন্টগুলি $ 0 দিয়ে শুরু করে পজিশনাল প্যারামিটারগুলিতে বরাদ্দ করা হয়েছে, তবে "ডি জন্য" $ 1 দিয়ে শুরু হওয়া পজিশনাল প্যারামিটারগুলির মাধ্যমে পুনরাবৃত্তি হবে। "_" হ'ল পাঠ্য যা $ 0 নির্ধারিত হয়েছে এবং ব্যবহৃত হবে না।