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