পার্ল ছাড়া একটি * নিক্সে rename
উপলব্ধ
কিছু * নিক্সে কোনও নতুন নাম উপলব্ধ নেই, সুতরাং এটি অন্য কোনও পদ্ধতি ব্যবহার করে পুনরায় নামকরণ করা প্রয়োজন। কয়েক বছর আগে আমি zmv
এখানে পরামর্শ দিয়েছিলাম যা দুর্দান্ত তবে অগত্যা উপলব্ধ নেই।
বিল্টইনস এবং সেড ব্যবহার করে আমরা এটি করতে দ্রুত শেল স্ক্রিপ্টটি চাবুক মারতে পারি যা পার্ল নামকরণ স্ক্রিপ্টের সাথে আমাদের খুব অনুরূপ সিনট্যাক্স দেয়, কিছুটা দক্ষতা হ্যান্ডলিংয়ের অভাব থাকলেও এটি কাজটি সম্পন্ন করে।
sedrename() {
if [ $# -gt 1 ]; then
sed_pattern=$1
shift
for file in $(ls $@); do
mv -v "$file" "$(sed $sed_pattern <<< $file)"
done
else
echo "usage: $0 sed_pattern files..."
fi
}
ব্যবহার
sedrename 's/Beethoven\ -\ //g' *.mp3
before:
./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3
after:
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3
বলুন আমরা লক্ষ্যযুক্ত ফোল্ডারগুলিও তৈরি করতে চেয়েছিলাম ...
যেহেতু mv
আমরা sedrename
এখানে ফোল্ডার তৈরি করতে পারছি না তেমনি এটি এখানে রয়েছে তবে এটি মোটামুটি ছোট একটি পরিবর্তন, তাই আমি এটিকেও অন্তর্ভুক্ত করাতে ভাল লাগবে।
আমাদের একটি ইউটিলিটি ফাংশন abspath
(বা নিখুঁত পাথ) প্রয়োজন যাতে আমরা সেড / নাম পরিবর্তনের প্যাটার্নের জন্য লক্ষ্য ফোল্ডার (গুলি) তৈরি করতে পারি যার মধ্যে নতুন ফোল্ডার কাঠামো অন্তর্ভুক্ত থাকে।
abspath () { case "$1" in
/*)printf "%s\n" "$1";;
*)printf "%s\n" "$PWD/$1";;
esac; }
এটি নিশ্চিত করবে যে আমরা আমাদের লক্ষ্যযুক্ত ফোল্ডারগুলির নাম জানি। আমরা যখন নাম পরিবর্তন করি তখন আমাদের লক্ষ্য ফাইলের নামে এটি ব্যবহার করতে হবে।
# generate the rename target
target="$(sed $sed_pattern <<< $file)"
# Use absolute path of the rename target to make target folder structure
mkdir -p "$(dirname $(abspath $target))"
# finally move the file to the target name/folders
mv -v "$file" "$target"
এখানে পুরো ফোল্ডার সচেতন স্ক্রিপ্ট ...
sedrename() {
if [ $# -gt 1 ]; then
sed_pattern=$1
shift
for file in $(ls $@); do
target="$(sed $sed_pattern <<< $file)"
mkdir -p "$(dirname $(abspath $target))"
mv -v "$file" "$target"
done
else
echo "usage: $0 sed_pattern files..."
fi
}
অবশ্যই, এটি এখনও কার্যকর হয় যখন আমাদের নির্দিষ্ট টার্গেট ফোল্ডার না থাকে।
যদি আমরা সমস্ত গান একটি ফোল্ডারে রাখতে চাই, ./Beethoven/
আমরা এটি করতে পারি:
ব্যবহার
sedrename 's|Beethoven - |Beethoven/|g' *.mp3
before:
./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3
after:
./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3
বোনাস বৃত্তাকার ...
ফোল্ডার থেকে একক ফোল্ডারে ফাইল স্থানান্তর করতে এই স্ক্রিপ্টটি ব্যবহার করে:
ধরে নিই আমরা মিলে যাওয়া সমস্ত ফাইল সংগ্রহ করতে চেয়েছিলাম এবং সেগুলি বর্তমান ফোল্ডারে রেখে দিতে পারি, আমরা এটি করতে পারি:
sedrename 's|.*/||' **/*.mp3
before:
./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3
after:
./Beethoven/ # (now empty)
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3
সেড রেজেক্স নিদর্শনগুলিতে নোট
নিয়মিত শেড প্যাটার্ন বিধিগুলি এই স্ক্রিপ্টে প্রয়োগ হয়, এই নিদর্শনগুলি পিসিআরই নয় (পার্ল সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন)। আপনি
আপনার প্ল্যাটফর্মের উপর নির্ভর করে sed -r
বা নিয়মিত অভিব্যক্তি সিনট্যাক্সকে বাড়িয়ে দিতে পারেন sed -E
।
man re_format
সেড বেসিক এবং এক্সটেন্ডেড রেজএক্সপেক্স নিদর্শনগুলির সম্পূর্ণ বিবরণের জন্য পসিক্স অনুগত দেখুন ।