নিম্নলিখিতটি আপনার পদ্ধতির সরাসরি সমাধান:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
তবে আপনার কাছে প্রচুর mv
ম্যাচের ফাইল থাকলে এটি খুব ব্যয়বহুল, কারণ আপনি প্রতিটি ম্যাচের জন্য একটি তাজা শেল (যেটি কার্যকর করে ) শুরু করে । এবং যদি আপনার কোনও ফাইলের নামে মজার অক্ষর থাকে তবে এটি বিস্ফোরিত হবে। আরও কার্যকর ও সুরক্ষিত পদ্ধতি হ'ল:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
এটিতে অদ্ভুত নামযুক্ত ফাইলগুলির সাথে কাজ করার সুবিধাও রয়েছে। যদি find
এটি সমর্থন করে তবে এটিকে কমিয়ে আনা যায়
find . -type f -name 'file*' -exec mv {} {}_renamed \;
xargs
যখন ব্যবহার করছেন না সংস্করণ দরকারী {}
হিসাবে,
find .... -print0 | xargs --null rm
এখানে rm
একবার কল করা হয় (বা বেশ কয়েকটিবার ফাইলের সাথে কয়েকবার) তবে প্রতিটি ফাইলের জন্য নয়।
আমি basename
আপনার প্রশ্নটি সরিয়ে দিয়েছি , কারণ এটি সম্ভবত ভুল: আপনি চলে foo/bar/file8
যান file8_renamed
, না foo/bar/file8_renamed
।
সম্পাদনা (মতামত হিসাবে প্রস্তাবিত):
find
ছাড়া সংক্ষিপ্ত যোগ করা হয়েছেxargs
- সুরক্ষার স্টিকার যুক্ত হয়েছে
x
অনর্থক:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
সংস্করণটির প্রথম উদাহরণের মতো দক্ষতা রয়েছে /