এটি দিয়ে ব্যবহার করুন bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
নামে একটি স্থান সহ ফাইলগুলি অনুসন্ধান করবে। ফাইলের নামগুলি একটি নলবাইট ( -print0
) দিয়ে ডিলিমিটার হিসাবে মুদ্রিত করা হবে যাতে বিশেষ ফাইলের নামগুলিও মোকাবেলা করতে পারে। তারপরে read
বিল্টিন নলবাইটের দ্বারা সীমাবদ্ধ ফাইলের নামগুলি পড়ে এবং শেষ পর্যন্ত mv
স্পেসগুলি একটি আন্ডারস্কোর দিয়ে প্রতিস্থাপন করে।
সম্পাদনা: আপনি যদি ডিরেক্টরিতেও ফাঁকা স্থান সরিয়ে নিতে চান তবে এটি কিছুটা জটিল। ডিরেক্টরিগুলি পুনরায় নামকরণ করা হয় এবং নামটির পরে আর অ্যাক্সেসযোগ্য হয় না find
। এটা চেষ্টা কর:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
sort -rz
ফাইল অর্ডার reverses, যাতে ফোল্ডারে গভীরতম ফাইল প্রথম স্থানান্তর করতে এবং ফোল্ডার নিজেই গত এক হতে হবে। সুতরাং, সমস্ত ফাইল এবং ফোল্ডারটির অভ্যন্তরে পুনরায় নামকরণের আগে কোনও ফোল্ডার পুনরায় নামকরণ করা হবে না। mv
লুপ কমান্ড একটি বিট খুব পরিবর্তিত হয়। টার্গেট নামে আমরা কেবল ফাইলের বেসনামে থাকা স্পেসগুলি সরিয়ে ফেলি, অন্যথায় এটি অ্যাক্সেসযোগ্য হবে না।