আমরা ধরে নিতে পারি যে sed
কোনও * নিক্স পাওয়া যায়, তবে আমরা নিশ্চিত হতে পারি না যে এটি sed -n
এমভি কমান্ড উত্পন্ন করতে সমর্থন করবে । ( দ্রষ্টব্য: কেবল জিএনইউ)sed
করে))
তবুও, ব্যাশ বিল্টিনস এবং সেড, আমরা এটির জন্য দ্রুত একটি শেল ফাংশন হুইপ করতে পারি।
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|\(.*\)\(-[0-9.]*\.pkg\)|\1\2|' *.pkg
before:
./Xft2-2.1.13.pkg
./jasper-1.900.1.pkg
./xorg-libXrandr-1.2.3.pkg
after:
./Xft2.pkg
./jasper.pkg
./xorg-libXrandr.pkg
লক্ষ্য ফোল্ডার তৈরি করা:
যেহেতু 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
সেড বেসিক এবং এক্সটেন্ডেড রেজএক্সপেক্স নিদর্শনগুলির সম্পূর্ণ বিবরণের জন্য পসিক্স অনুগত দেখুন ।