$ Filename_h से $ filename_half तक निर्देशिका की सभी फ़ाइलों का नाम बदलें?


139

मृत सरल।

मैं कैसे नाम बदलूँ?

05_h.png
06_h.png

सेवा

05_half.png
06_half.png

कम से कम, मुझे लगता है कि यह सरल है, लेकिन इस तरह की चीज़ के लिए Google के लिए कठिन है जब तक कि आप पहले से ही नहीं जानते।

धन्यवाद....

जवाबों:


301

बस बैश का उपयोग करें, बाहरी आदेशों को कॉल करने की आवश्यकता नहीं है।

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

7
बैश का बिल्ट-इन-स्ट्रिंग रिप्लेसमेंट का अच्छा इस्तेमाल होता है, न कि
सेड

3
फ़ाइल / _h.png / _half.png regex है?
user2799603

15
नहीं, प्रारूप यह है: $ {string / substring / प्रतिस्थापन} - "स्थानापन्न format rst घटना"। : अधिक जानकारी के लिए जाँच इस चीट शीट (अनुभाग "तार") bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
Windrider

11
के लिए कोई कारण Do not add #!/bin/sh? मैंने इस कथन के साथ / बिना काम करने की कोशिश की।
रयान

6
@Ryan @ इशन जैन वास्तव में यह बैकएंड शेल को इंगित करता है जिसे स्क्रिप्ट को निष्पादित करना होगा। श और बैश अलग-अलग गोले हैं इसलिए यह स्क्रिप्ट व्यवहार और वाक्य रचना को प्रभावित कर सकता है। चूंकि स्क्रिप्ट एक बैश बिल्ट-इन स्ट्रिंग प्रतिस्थापन का उपयोग करती है इसलिए आपको हेडर जोड़ना चाहिए #!/bin/bash। इसने कहा, बैश आम तौर पर कई कंप्यूटरों में डिफ़ॉल्ट शेल होता है इसलिए आपको कई अंतर नहीं मिलेंगे: D आप यहां
क्रिस्टियन रेमन-कोर्टेस

65

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

1
@CarolineAlexiou: मैंने उदाहरण परीक्षण सत्र जोड़ा। कृपया इसे आजमाएँ। आपके पास शायद कुछ टाइपो है। का आउटपुट क्या है ls? क्या rename ...आप कोशिश कर रहे हैं?
मिचेल erजेर

2
मैक पर काम नहीं करता है, fwiw। renameएक मानक यूनिक्स उपकरण नहीं है।
tandrewnichols

1
@tandrewnichols, homebrew बाहर की कोशिश - एक बार स्थापित, नाम के साथ सेकंड में उपलब्ध हो जाता हैbrew install rename
Simbamangu

4
मेरे लिए जैसा कि नाम बदलने से काम नहीं चला 's//'- मैंने आदमी को संदर्भित किया और सरल rename [options] expression replacement file...rename from util-linux 2.23.2
सिनॉप्सिस था

2
ध्यान रखें कि .किसी भी वर्ण से मेल खाता है, न कि केवल एक बिंदु - शाब्दिक बिंदु के लिए, \.इसके बजाय का उपयोग करें
Meisner

11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done

1
यह पहले से सूखा रन करने के लिए बहुत अच्छा है। मैंने पहली बार दूसरी पंक्ति के रूप में प्रतिस्थापित mv $f $fnewकिया है echo $fnewताकि यह सुनिश्चित किया जा सके कि आउटपुट समझदार है।
लोबती

10

क्या आप एक शुद्ध बैश समाधान की तलाश कर रहे हैं? कई दृष्टिकोण हैं, लेकिन यहां एक है।

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

यह मानते हुए कि वे दो उदाहरण आपके ही हैं। फ़ाइलें।

सामान्य स्थिति के लिए, फ़ाइल का नामकरण पहले कवर किया गया है


6

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


4

मेरे पास एक समान प्रश्न था: मैनुअल में, यह नाम बदलने का वर्णन करता है

rename [option] expression replacement file

तो आप इसे इस तरह से उपयोग कर सकते हैं

rename _h _half *.png

कोड में: '_h' वह अभिव्यक्ति है जिसे आप ढूंढ रहे हैं। '_half' वह पैटर्न है जिसे आप बदलना चाहते हैं। '* .png' उन फ़ाइलों की श्रेणी है जिन्हें आप अपनी संभावित लक्ष्य फ़ाइलों की तलाश में हैं।

आशा है कि यह सी मदद कर सकता है:


1

एक अन्य दृष्टिकोण मैन्युअल रूप से बैच का नाम बदलने के विकल्प का उपयोग कर सकता है

फ़ाइल पर राइट क्लिक करें -> फ़ाइल कस्टम कमांड -> बैच का नाम बदलें और आप एच को बदल सकते हैं। आधे के साथ।

यह WinSCP आदि का उपयोग करके linux आधारित gui के लिए काम करेगा


0

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


0

हालांकि उत्तर सेट पूरा हो गया है, मुझे एक और लापता को जोड़ना होगा।

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.