हम मान सकते हैं कि sed
यह किसी भी * निक्स पर उपलब्ध है, लेकिन हम यह सुनिश्चित नहीं कर सकते हैं कि यह sed -n
mv कमांड उत्पन्न करने के लिए समर्थन करेगा। ( नोट: केवल GNU 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
(या पूर्ण पथ) क्योंकि bash में यह निर्माण नहीं है।
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 रेगेक्स पैटर्न पर ध्यान दें
इस स्क्रिप्ट में नियमित सेड पैटर्न नियम लागू होते हैं, ये पैटर्न पीसीआरई (पर्ल कम्पेटिबल रेगुलर एक्सप्रेशंस) नहीं हैं।
आपके प्लेटफॉर्म पर sed -r
या तो या sed -E
आपके आधार पर , आप एक्सटेंडेड रेगुलर एक्सप्रेशन सिंटैक्स कर सकते हैं।
POSIX अनुपालन man re_format
को सीड बेसिक और विस्तारित रेगेक्स पैटर्न के पूर्ण विवरण के लिए देखें ।