সহজ উপায় পেতে slhck এর স্ক্রিপ্ট
সাবফোল্ডার এবং ফাইল অনুসন্ধান করতে যাও recursively, আপনি ব্যাশ ব্যবহার করছেন, যোগ হয় shopt -s globstarএবং তারপর পরিবর্তন *করার জন্য **। যদি আপনার নামে "অবৈধ" অক্ষরযুক্ত ডিরেক্টরি থাকে তবে এটি সঠিকভাবে কাজ করবে না। আপনি এন +1 বার স্ক্রিপ্ট চালিয়ে কেবল এটিকে ঘিরে কাজ করতে পারেন যেখানে এন যে কোনও পথে অবৈধ অক্ষরের সাথে সর্বাধিক সংখ্যক ডিরেক্টরি রয়েছে। উদাহরণস্বরূপ, আপনার যদি একটি f@catডিরেক্টরি এবং তার dog#নীচে ডিরেক্টরি এবং তার নীচে ডিরেক্টরি থাকে তবে আপনার fox!চারবার স্ক্রিপ্ট চালানো দরকার।
আমি নীচে এটি করার আরও ভাল উপায় দিচ্ছি।
- slhck এর স্ক্রিপ্ট আসলে
mv -iপরিবর্তে বলা উচিত mv। যদি আপনার কাছে ফাইলগুলি নামকরণ করা, বলুন cost+taxএবং cost-tax, থাকে, তবে স্ক্রিপ্টটি তাদের উভয়টির নাম বদলে দেবে costtax
(বা cost_tax, আমরা সেই পরিবর্তন করার পরে)। এটি দ্বিতীয় ফাইলের সাথে প্রথম ফাইলটি ক্লোবার করবে। -i( আমি nteractive) বিকল্প কারণ হবে mvনিশ্চিতকরণ জন্য জিজ্ঞাসা করতে। আপনাকে ম্যানুয়ালি এই জাতীয় সংঘর্ষগুলি পরিচালনা করতে হবে।
- "অবৈধ" অক্ষরগুলিকে আন্ডারস্কোর দিয়ে প্রতিস্থাপন
${file//[^0-9A-Za-z.]}করতে ${file//[^0-9A-Za-z.]/_}
(অথবা আরও ভাল, এখনও ${file//[^0-9A-Za-z._]/_}) পরিবর্তন করুন।
সুতরাং, উপরোক্ত পরিবর্তনগুলির সাথে স্লাহকের স্ক্রিপ্টটি হয়ে যায়
shopt -s globstar
for f in "$1"/**
do
dir="$(dirname "$f")"
file="$(basename "$f")"
mv -i -- "$f" "${dir}/${file//[^0-9A-Za-z._]/_}"
done
এটি চলাকালীন, একটি আর্গুমেন্ট (যেমন, .) সরবরাহ করার বিষয়ে নিশ্চিত হোন ; অন্যথায় এটি ফাইল সিস্টেমের সমস্ত ফাইলের নাম পরিবর্তন করার চেষ্টা করবে (শুরু করে /)। $1যুক্তিটি নাল নয় তা যাচাই করার জন্য আপনার সম্ভবত স্ক্রিপ্টে কিছু রাখা উচিত ।
এটির নামগুলিতে অবৈধ অক্ষরযুক্ত ডিরেক্টরিতে সমস্যা রয়েছে কারণ উপরের নীচে নীচে শাখার সাথে **উপ গাছের নীচে সমস্ত ফাইল এবং ডিরেক্টরিগুলির তালিকায় প্রসারিত $1। সুতরাং, যদি আপনি f@cat/dog#, এটা দেখতে হবে f@catএবং f@cat/dog#আর্গুমেন্ট হিসাবে। সুতরাং এটির পুনঃনামকরণ f@catকরা হবে f_catএবং তারপরে অনুসন্ধান করা হবে f@cat/dog#
- যা আর বিদ্যমান নেই, কারণ এটির নামকরণ করা হয়েছে f_cat/dog#। আমরা তা করে তা ঠিক করতে পারি
find "$1" -depth -name '*[^0-9A-Za-z._]*' -exec sh -c \
'for f do dir="$(dirname "$f")"; file="$(basename "$f")";
mv -i -- "$f" "${dir}/${file//[^0-9A-Za-z.]/_}"; done' sh {} +
-depthবিকল্পে findএটা নীচে টু টপ অর্ডার ডিরেক্টরিতে শাখা তাকান বলে। -nameডিরেক্টিভের এটা ফাইলের নাম যে শুধুমাত্র দেখুন ঘটায় প্রয়োজন নতুন নামকরণ করা হয়। (অন্য স্ক্রিপ্ট ত্রুটি বার্তা দেবে যখন এটি ফাইলগুলিকে নিজের নাম পরিবর্তন করার চেষ্টা করবে, কারণ তাদের নামগুলিতে কোনও অবৈধ অক্ষর নেই))
findতারপরে নামগুলি একটি শেলের সাথে প্রেরণ করে যা স্ক্রিপ্টের মতো একই কাজ করে তবে একক কমান্ড হিসাবে ।