আপনার কমান্ডটি প্রথমে শেল দ্বারা দুটি কমান্ডকে a দ্বারা বিভক্ত করা হয়েছে ;যা একটি নতুন লাইনের সমতুল্য:
find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;
আপনি যদি শেল কমান্ডটি চালাতে চান তবে একটি শেলটি স্পষ্টভাবে অনুরোধ করুন bash -c(অথবা sh -cযদি আপনি শেলটি বিশেষভাবে ব্যাশ করে না তবে):
find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;
{}শেলের আর্গুমেন্ট হিসাবে ব্যবহারটি নোট করুন ; এটি জিরোথ আর্গুমেন্ট (যা সাধারণত শেল বা স্ক্রিপ্টের নাম, তবে এখানে এখানে কিছু আসে যায় না), তাই হিসাবে উল্লেখ করা হয় "$0"।
আপনি একবারে শেলটিতে একাধিক ফাইলের নামগুলি পাস করতে পারেন এবং সেগুলির মাধ্যমে শেলটি পুনরাবৃত্তি করতে পারেন, এটি আরও দ্রুত হবে। এখানে আমি _স্ক্রিপ্টের নাম হিসাবে পাস করি এবং নিম্নলিখিত আর্গুমেন্টগুলি ফাইলের নাম, যা for x(এর জন্য একটি শর্টকাট for x in "$@") পুনরাবৃত্তি হয়।
find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +
নোট করুন যে বাশ 4, বা zsh এ, আপনার এখানে কোনও সন্ধানের দরকার নেই। বাশে, একটি পুনরাবৃত্ত ডিরেক্টরি গ্লোব জন্য স্থায়ী সক্রিয় করতে চালান shopt -s globstar(এটি আপনার রাখুন ~/.bashrc) **/। (Zsh এ, এটি সর্বদা সক্রিয় থাকে)) তারপরে
chgrp -v new_group -- **/*; chmod -v 770 -- **/*
অথবা আপনি যদি চান ফাইলগুলি ক্রমে পুনরাবৃত্তি করা হোক
for x in **/*; do
chgrp -v new_group -- "$x"
chmod -v 770 -- "$x"
done
findকমান্ডের সাথে একটি পার্থক্য হ'ল শেলটি ডট ফাইলগুলিকে উপেক্ষা করে (ফাইলগুলির নাম যার সাথে শুরু হয় a .)। এগুলি অন্তর্ভুক্ত করতে, ব্যাশে, প্রথম সেট GLOBIGNORE=.:..; zsh এ, গ্লোব **/*(D)প্যাটার্ন হিসাবে ব্যবহার করুন ।
'{}'(ধনুর্বন্ধনীগুলির চারপাশে অ্যাস্ট্রোফেস