আপনি একই সাথে ফাইল এবং ডিরেক্টরিগুলির নাম পরিবর্তন করতে চাইলে আপনি কিছু সমস্যার সমাধান করতে যাচ্ছেন । কেবল একটি ফাইলের নামকরণ করা যথেষ্ট সহজ। তবে আপনি নিশ্চিত করতে চান ডিরেক্টরিগুলিও নতুন নামকরণ হয়েছে। আপনি কেবল না পারেন, mv Motörhead/Encöding Motorhead/Encoding
যেহেতু Motorhead
কলের সময়ে উপস্থিত করা হবে না।
সুতরাং, আমাদের সমস্ত ফাইল এবং ফোল্ডারগুলির গভীরতার প্রথম ট্রভারসালাল প্রয়োজন এবং তারপরে কেবলমাত্র বর্তমান ফাইল বা ফোল্ডারটির নতুন নামকরণ করতে হবে। নিম্নলিখিতটি find
আমার ওএস এক্সে জিএনইউ এবং বাশ 4.2.42 নিয়ে কাজ করে।
#!/usr/bin/env bash
find "$1" -depth -print0 | while IFS= read -r -d '' file; do
d="$( dirname "$file" )"
f="$( basename "$file" )"
new="${f//[^a-zA-Z0-9\/\._\-]/}"
if [ "$f" != "$new" ] # if equal, name is already clean, so leave alone
then
if [ -e "$d/$new" ]
then
echo "Notice: \"$new\" and \"$f\" both exist in "$d":"
ls -ld "$d/$new" "$d/$f"
else
echo mv "$file" "$d/$new" # remove "echo" to actually rename things
fi
fi
done
আপনি new="${f//[\\\/\:\*\?\"<>|]/}"
উইন্ডোজ যে হ্যান্ডেল করতে পারে না এমন কোনও প্রতিস্থাপন করতে চাইলে আপনি ব্যবহার করে রেজেক্স পরিবর্তন করতে পারেন।
এই স্ক্রিপ্টটি সংরক্ষণ করুন rename.sh
, এটি দিয়ে সম্পাদনযোগ্য chmod +x rename.sh
। তারপরে, এটি কল করুন rename.sh /some/path
।
কোনও ফাইলের নাম সংঘর্ষ (" Notice
" ঘোষণা) সমাধান করার বিষয়টি নিশ্চিত করুন ।
যদি আপনি পুরোপুরি নিশ্চিত হন যে এটি সঠিক প্রতিস্থাপন করে, echo
তবে স্ক্রিপ্ট থেকে কিছুটি মুদ্রণের পরিবর্তে জিনিসটির নতুন নামকরণ করতে সরান what
নিরাপদ থাকতে, আমি প্রথমে ফাইলগুলির একটি ছোট উপসেটে এটি পরীক্ষা করার পরামর্শ দেব।
বিকল্প ব্যাখ্যা
এখানে কী চলছে তা বোঝাতে:
-depth
ডিরেক্টরিগুলি গভীরতা-পূর্বে পুনরাবৃত্তি হয়েছে তা নিশ্চিত করবে, তাই আমরা শেষ থেকে সবকিছু "রোল আপ" করতে পারি। সাধারণত, find
আলাদাভাবে অনুসরণ করে (তবে প্রথম প্রস্থ নয়)।
-print0
নিশ্চিত find
আউটপুট তাই আমরা সঙ্গে এটি পড়তে পারেন, নাল-সীমা নির্দেশ করা হয় read -d ''
মধ্যে file
পরিবর্তনশীল। এটি করা আমাদের সমস্ত ধরণের অদ্ভুত ফাইলের নাম, স্পেস সহ নতুন ফাইলগুলি সহ ডিল করতে সহায়তা করে।
- আমরা ফাইলটির ডিরেক্টরিটি পেয়ে যাব
dirname
। আপনার ভেরিয়েবলগুলি যথাযথভাবে উদ্ধৃত করতে ভুলবেন না, অন্যথায় স্পেস বা গ্লোববিং অক্ষরের কোনও পথই এই স্ক্রিপ্টটি ভেঙে দেবে।
- আমরা আসল ফাইলের নাম (বা ডিরেক্টরি নাম) এর সাথে পেয়ে যাব
basename
।
- তারপরে, আমরা
$f
বাশের স্ট্রিং প্রতিস্থাপনের ক্ষমতাগুলি ব্যবহার করে কোনও অবৈধ অক্ষর মুছে ফেলি। অবৈধ অর্থ এমন কোনও কিছু যা ছোট বা বড় হাতের অক্ষর, একটি অঙ্ক, একটি স্ল্যাশ ( \/
), একটি বিন্দু ( \.
), আন্ডারস্কোর বা বিয়োগ-হাইফেন নয়।
- যদি
$f
ইতিমধ্যে পরিষ্কার থাকে (পরিষ্কার করা নামটি বর্তমান নামের সাথে একরকম), এড়িয়ে যান।
- যদি
$new
ইতিমধ্যে ডিরেক্টরিতে বিদ্যমান থাকে $d
(যেমন, আপনার কাছে ফাইলগুলির নাম resume
এবং résumé
একই ডিরেক্টরি রয়েছে), সতর্কতা জারি করুন। আপনি এটির নাম পরিবর্তন করতে চান না, কারণ কিছু সিস্টেমে mv foo foo
সমস্যা দেখা দেয়। তা না হলে,
- আমরা শেষ পর্যন্ত এর নতুন নামে নতুন ফাইল (বা ডিরেক্টরি) নামকরণ করি
এই যেহেতু শুধুমাত্র গভীরতম অনুক্রমের কাজ করবে পুনঃনামকরনের Motörhead/Encöding
করতে Motorhead/Encoding
দুটি ধাপে সম্পন্ন করা হয়:
mv Motörhead/Encöding Motörhead/Encoding
mv Motörhead Motorhead
এটি নিশ্চিত করে যে সমস্ত প্রতিস্থাপন সঠিক ক্রমে সম্পন্ন হয়েছে।
ফাইল এবং পরীক্ষা রান উদাহরণ
একটি বেস ফোল্ডার নামক কিছু ফাইল ধরে নেওয়া যাক test
:
test
test/Motörhead
test/Motörhead/anöther_file.mp3
test/Motörhead/Encöding
test/Randöm
test/Täst
test/Täst/Töst
test/with space
test/with-hyphen.txt
test/work
test/work/resume
test/work/résumé
test/work/schedule
এখানে একটি রান ইন ডিবাগ মোডের (আউট echo
সামনের দিকে mv
) আউটপুট , অর্থাত, যে আদেশগুলি ডাকা হবে এবং সংঘর্ষের সতর্কতা:
mv test/Motörhead/anöther_file.mp3 test/Motörhead/another_file.mp3
mv test/Motörhead/Encöding test/Motörhead/Encoding
mv test/Motörhead test/Motorhead
mv test/Randöm test/Random
mv test/Täst/Töst test/Täst/Tost
mv test/Täst test/Tast
mv test/with space test/withspace
Notice: "resume" and "résumé" both exist in test/work:
-rw-r—r-- … … test/work/resume
-rw-r—r-- … … test/work/résumé
বিজ্ঞপ্তিটি বার্তা অভাবে with-hyphen.txt
, schedule
আর test
নিজেই।
mv
ইতিমধ্যে যে গন্তব্যটি উপস্থিত রয়েছে সেখানে মামলা পরিচালনা করতে আপনি যুক্তি যুক্ত করতে চাইতে পারেন , যা ঘটতে পারে (1) যদি আপনার কাছে ইতিমধ্যে পরিষ্কার ফাইল রয়েছে (ফলস্বরূপmv foo foo
), বা (2) যদি আপনার একই নামের ফাইলগুলি বাদে থাকে বিশেষ অক্ষরের জন্য (উদাহরণস্বরূপ,mv Encöding Encoding
যেখানে ইতিমধ্যে আপনি ইতিমধ্যে একটিEncoding
ফাইল রয়েছেEncöding
)।