एक आदेश के साथ फ़ाइलों के एक समूह का नाम बदलें


38

अगर मेरे पास .htm एक्स्टेंशन वाली फाइलों का एक समूह है, तो मैं उन सभी का नाम कैसे बदल सकता हूं।

mv *.htm *.html

काम नहीं करता।


बस पूर्णता के लिए, ren *.htm *.htmlविंडोज में काम करेगा।
ब्रायन बर्न्स

जवाबों:


50

या, आप शुद्ध बैश का उपयोग कर सकते हैं ... (एमवी को छोड़कर, वह है ..)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done

और बुरा बेसन सामान से बचें। ;)

बैश में चर विस्तार विकल्पों का एक व्यापक सेट है। यहां इस्तेमाल किया गया, '%', चर के मान से सबसे छोटे मिलान प्रत्यय को हटाता है। पैटर्न एक ग्लोब पैटर्न है, इसलिए ${file%.*}यह भी काम करेगा। '%%' ऑपरेटर सबसे बड़े मिलान प्रत्यय को हटा देता है, और ऊपर दिए गए उदाहरण में विनिमेय है, जैसा कि पैटर्न तय हो गया है, ${file%%.*}.htmlहालांकि abhtm को a.html में बदल देगा।

अधिक स्वच्छ चाल के लिए बैश मैनपेज के चर सबस्टेशन अनुभाग देखें। बहुत कुछ है जो सीधे बैश के भीतर किया जा सकता है।


1
यह भी ध्यान दें कि ये पैरामीटर विस्तार बैश तक सीमित नहीं हैं । वे सभी बॉर्न व्युत्पन्न गोले (पर उपलब्ध हैं , ksh , बैश , zsh , पानी का छींटा , राख , आदि)। विस्तार "शेल कमांड लैंग्वेज" के लिए POSIX विनिर्देश का एक हिस्सा है और अत्यधिक पोर्टेबल हैं।
क्रिस जॉन्सन

11

फ़ाइलनामों में रिक्त स्थान, न्यूलाइन्स या अन्य व्हाट्सएप नहीं होना चाहिए, लेकिन फ्रीहिट के उत्तर का यह संस्करण उन लोगों को संभालता है। इसका उपयोग $()पठनीयता के बजाय अन्य लाभों के साथ पठनीयता के लिए भी करता है।

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done

इससे भी बेहतर - अंत में जोड़ने के विशेष मामले के लिए:

for file in *.htm
do
    mv "$file" "${file}l"
done

11

rename(1)एक पर्ल उपयोगिता है जो वास्तव में वही करती है जो आप चाहते हैं। इस मामले में:

rename 's/\.htm$/.html/' *htm

या यदि आप उप निर्देशिकाओं का उपयोग कर रहे हैं

(बैश 4.0 और globstar सेटिंग की आवश्यकता है: shopt -s globstar)

rename 's/\.htm$/.html/' **/*htm


1
नाम बदलना आसान है, लेकिन एक मानक यूनिक्स कार्यक्रम नहीं है; मूल प्रश्न निर्दिष्ट नहीं करता है कि कौन सा यूनिक्स है। कुछ स्थानों पर "prename" होने लगता है।
Freiheit

2
renameपर्ल के साथ आता है, और मूल रूप से हर यूनिक्स इन दिनों पर्ल के साथ आता है।
TRS-80

3
हां, लेकिन हर यूनिक्स में 'नाम बदलने' जैसे सहायक कार्यक्रम शामिल नहीं हैं, जब वे सिस्टम पर पर्ल डालते हैं। उदाहरण के लिए, OSX का इस पर "नाम" नहीं है।
Freiheit

1
@William: डबल तारांकन सिंटैक्स केवल बैश 4 और इसके बाद के संस्करण में उपलब्ध है और केवल तभी चालू होता है जब इसे shopt -s globstarडिफ़ॉल्ट रूप से बंद किया जाता है। इसके अलावा, लिनक्स और यूनिक्स में फ़ोल्डर्स के बजाय निर्देशिकाएं हैं।
अगली सूचना तक रोक दिया गया।

6
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

चारों ओर पहली बार के echoसामने इसे आज़माएं mv

आपके मूल के साथ समस्या यह है कि " mv *.htm *.html" *शेल द्वारा संभाला गया है, इसलिए mvकमांड केवल वर्तमान निर्देशिका में .htm और .html फ़ाइलों की सूची देखता है। दूसरे शब्दों में, " mv foo.htm bar.htm stuff.htm six.htm file.htm" जैसा कुछ । mv केवल जानता है कि 2 से अधिक तर्कों को कैसे संभालना है यदि अंतिम एक निर्देशिका है।


1
आपको रिक्त स्थान को संभालने के लिए "$ फ़ाइल" उद्धृत करना चाहिए।
रिचर्ड हॉकिंस

मूल समस्या के आपके विवरण पर अधिक जोर दिया जाना चाहिए। यह शेल वाइल्डकार्ड विस्तार व्यवहार आश्चर्यजनक है और विंडोज लैंड से आने वाले किसी व्यक्ति के लिए सहज नहीं है, और यह समझने के लिए कि शेल क्या करता है, यह स्पष्ट नहीं करता है कि मूल एप्लिकेशन mvकाम क्यों नहीं करेगा।
ग्रेग हेवगिल

3

फिर भी स्ट्रिंग की जगह एक और शुद्ध बैश उदाहरण।

for file in *.htm; do mv $file ${file/htm/html}; done

अतिरिक्त - यह एक स्ट्रिंग की सभी घटनाओं को प्रतिस्थापित करता है

for file in *.htm; do mv $file ${file//htm/html}; done


1

सबसे अच्छा उपकरण mmv है

mmv \*.htm #1.html

" GNU / Linux कमांड लाइन उपकरण सारांश " में उपयोग के अन्य उदाहरण (और अन्य उपकरण) ।


1
आपका उपयोग उदाहरण विफल रहता है। आपको भागने की जरूरत है #
क्रिस्टियन सियुपिटु

नहीं, यह काम करता है (मैं सुपरवेयर पर पोस्ट करने से पहले हमेशा परीक्षण करता हूं)। भागने की आवश्यकता # आपके द्वारा उपयोग किए जाने वाले शेल पर निर्भर करती है (मैं zsh का उपयोग करता हूं)।
bortzmeyer

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.