जवाबों:
बस बैश का उपयोग करें, बाहरी आदेशों को कॉल करने की आवश्यकता नहीं है।
for file in *_h.png
do
mv "$file" "${file/_h.png/_half.png}"
done
ना जोड़े #!/bin/sh
उन है कि एक लाइनर की जरूरत के लिए:
for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done
Do not add #!/bin/sh
? मैंने इस कथन के साथ / बिना काम करने की कोशिश की।
#!/bin/bash
। इसने कहा, बैश आम तौर पर कई कंप्यूटरों में डिफ़ॉल्ट शेल होता है इसलिए आपको कई अंतर नहीं मिलेंगे: D आप यहां
rename
आदेश का प्रयास करें :
rename 's/_h.png/_half.png/' *.png
अपडेट करें:
उदाहरण का उपयोग:
कुछ सामग्री बनाएँ
$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls
one_h.png three_h.png two_h.png
जांच समाधान:
$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png three_half.png two_half.png
ls
? क्या rename ...
आप कोशिश कर रहे हैं?
rename
एक मानक यूनिक्स उपकरण नहीं है।
brew install rename
's//'
- मैंने आदमी को संदर्भित किया और सरल rename [options] expression replacement file...
rename from util-linux 2.23.2
.
किसी भी वर्ण से मेल खाता है, न कि केवल एक बिंदु - शाब्दिक बिंदु के लिए, \.
इसके बजाय का उपयोग करें
for f in *.png; do
fnew=`echo $f | sed 's/_h.png/_half.png/'`
mv $f $fnew
done
mv $f $fnew
किया है echo $fnew
ताकि यह सुनिश्चित किया जा सके कि आउटपुट समझदार है।
क्या आप एक शुद्ध बैश समाधान की तलाश कर रहे हैं? कई दृष्टिकोण हैं, लेकिन यहां एक है।
for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done
यह मान लेता है कि वर्तमान निर्देशिका की एकमात्र फाइलें जो समाप्त होती हैं _h.png
हैं, वे हैं जिनका आप नाम बदलना चाहते हैं।
बहुत अधिक विशेष रूप से
for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done
यह मानते हुए कि वे दो उदाहरण आपके ही हैं। फ़ाइलें।
सामान्य स्थिति के लिए, फ़ाइल का नामकरण पहले कवर किया गया है ।
rename
पर्ल में लिखी उपयोगिता का उपयोग करें । हो सकता है कि यह डिफ़ॉल्ट रूप से उपलब्ध नहीं है, हालांकि ...
$ touch 0{5..6}_h.png
$ ls
05_h.png 06_h.png
$ rename 's/h/half/' *.png
$ ls
05_half.png 06_half.png
मेरे पास एक समान प्रश्न था: मैनुअल में, यह नाम बदलने का वर्णन करता है
rename [option] expression replacement file
तो आप इसे इस तरह से उपयोग कर सकते हैं
rename _h _half *.png
कोड में: '_h' वह अभिव्यक्ति है जिसे आप ढूंढ रहे हैं। '_half' वह पैटर्न है जिसे आप बदलना चाहते हैं। '* .png' उन फ़ाइलों की श्रेणी है जिन्हें आप अपनी संभावित लक्ष्य फ़ाइलों की तलाश में हैं।
आशा है कि यह सी मदद कर सकता है:
rename
उपयोगिता का उपयोग करें :
rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' *
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png
हालांकि उत्तर सेट पूरा हो गया है, मुझे एक और लापता को जोड़ना होगा।
for i in *_h.png;
do name=`echo "$i" | cut -d'_' -f1`
echo "Executing of name $name"
mv "$i" "${name}_half.png"
done