बैश में पुन: फ़ाइल एक्सटेंशन बदलें


87

मैं एक निर्देशिका के माध्यम से पुनरावृत्ति करना चाहता हूं और एक निश्चित विस्तार की सभी फाइलों के विस्तार को बदलना चाहता हूं, को कहना .t1है .t2। ऐसा करने के लिए बैश कमांड क्या है?


14
imho यह एक डुप्लिकेट प्रश्न नहीं है - दूसरा प्रश्न पुनरावर्ती नहीं है
shonky linux उपयोगकर्ता

जवाबों:


207

यदि आपके पास नाम उपलब्ध है तो उपयोग करें:

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' +

वरना:

find . -name '*.t1' -exec rename .t1 .t2 {} +

यदि नाम उपलब्ध नहीं है तो उपयोग करें:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +

20
find . -name '*.t1' -exec rename .t1 .t2 {} +
एरोन ब्लेंकुश

2
(मेरा संस्करण renamesed शैली प्रतिस्थापन अभिव्यक्ति की अनुमति नहीं देता है। लिनक्स से प्यार करना होगा। मुझे इस तरह से सामान करने के लिए विंडोज के लिए TotalCommander स्थापित करना पड़ता था।)
हारून ब्लेंकश

6
यदि कोई भी सोच रहा है कि "${1%.t1}".t2भाग क्या करता है, जैसे मैंने किया था: यह निम्नलिखित करने के लिए बैश स्ट्रिंग हेरफेर का उपयोग करता है: 1 / पहले स्थितीय पैरामीटर ले लो $1और .t1इसके अंत (प्रतिशत साइन %ऑपरेटर) से स्ट्रिंग शाब्दिक को छोटा करें । 2 / .t2परिणाम के लिए स्ट्रिंग शाब्दिक जोड़ें ।
जैक

2
नाम मेरे लिए OSX में काम नहीं किया, लेकिन bash संस्करण भयानक है b / c मैंने अभी mv के सामने 'git' जोड़ा है और अब git खुश है: -D
bdombro

3
find . -type f -name '*.t1'फ़ोल्डर्स से बचने के लिए उपयोगकर्ता को पसंद करते हैं
गोलक सारंगी

8

यदि आपका संस्करण विकल्प का bashसमर्थन करता globstarहै (संस्करण 4 या बाद का):

shopt -s globstar
for f in **/*.t1; do
    mv "$f" "${f%.t1}.t2"
done 

7

या आप बस mmvकमांड स्थापित कर सकते हैं और कर सकते हैं:

mmv '*.t1' '#1.t2'

यहाँ #1पहला ग्लोब पार्ट है यानी *में *.t1

या शुद्ध बाश सामान में, एक सरल तरीका होगा:

for f in *.t1; do
    mv "$f" "${i%.t1}.t2"
done

(अर्थात: forबाह्य कमांड की मदद के बिना फ़ाइलों को सूचीबद्ध कर सकते हैं जैसे कि lsया find)

HTH


7
मुझे लगता है कि "पुनरावर्ती" के ओपी के उपयोग के रूप में अच्छी तरह से निर्देशिका के उपनिर्देशिका में फ़ाइलों का नाम बदलने के लिए संदर्भित करता है।
चेपनर

क्षमा करें, लेकिन # 1 का अर्थ क्या है?
inafalcao

1
यह पहली बार ग्लोब हिस्सा है यानी *में*.t1
ZMO

रिकर्सिवली: $ mmv -n ';*.t1' '#1#2.t2'-n
निष्कासन के

5

मैं इस तरह से मारूंगा:

for i in $(ls *.t1); 
do
    mv "$i" "${i%.t1}.t2" 
done

संपादित करें: मेरी गलती: यह पुनरावर्ती नहीं है, यहाँ पुनरावर्ती बदलते नाम के लिए मेरा तरीका है:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2"
done

8
एलएस पार्स मत करो , और उसी पृष्ठ को देखें जिसके लिए आपका findसिंटैक्स खराब है। इसके अलावा, सुनिश्चित करें कि आप अपने चर को फिर से उद्धृत करें
मोनिका को पुन: स्थापित करें

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