मैं कई फ़ाइलों के विस्तार को कैसे बदलूँ?


166

मैं से एक फाइल एक्सटेंशन परिवर्तन करना चाहते हैं *.txtके लिए *.text। मैंने basenameकमांड का उपयोग करने की कोशिश की , लेकिन मुझे एक से अधिक फ़ाइल बदलने में परेशानी हो रही है।

यहाँ मेरा कोड है:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done

मुझे यह त्रुटि मिल रही है:

basename: too many arguments Try basename --help' for more information

जवाबों:


175

ग्रेग विकी से सीधे :

# सभी का नाम बदलें
f में * .txt के लिए; करना
    mv - "$ f" "$ {f% .txt} .text"
किया हुआ

यह भी देखें कि आपको पार्सls क्यों नहीं करना चाहिए

संपादित करें: यदि आपको basenameअपने सिंटैक्स का उपयोग करना है तो वह होगा:

f में * .txt के लिए; करना
    mv - "$ f" "$ (बेसन -" $ f ".txt) .text
किया हुआ

48
स्पष्टीकरण के बिना यहां कुछ थोड़ा उन्नत बैश सिंटैक्स का उपयोग किया गया है। मुझे इसे पूरी तरह से समझने के लिए Google को कई बातें करनी थीं। मेरी स्थिति में दूसरों की मदद करने के लिए, यहां ग्लब्स ( *.txtसिंटैक्स) , नंगे डबल डैश-- और निर्माण के भीतर% प्रतीक के उपयोग के${} बारे में कुछ संदर्भ दिए गए हैं । अब तक मैं कभी भी बाद वाले दो का सामना नहीं कर पाया था और यह नहीं जान पाया था कि वास्तव में पूर्व के साथ क्या हो रहा है।
मार्क अमेरी

3
नीचे माथियास ब्रौन के उत्तर को देखें - बहुत सरल, एक ही बात को पूरा करता है।
बीटीके

10
वन लाइनरfor f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
मर्कल जुआन

1
आपके पास एक लापता है; पाठ के बाद "।
Pétur Ingi Egilsson

2
दूसरी लाइन पर @ PéturIngiEgilsson? नहीं, इसकी आवश्यकता नहीं है।
जसनवरी २ j

132

यहां बताया गया है कि मैं डेबियन पर वर्तमान निर्देशिका में सभी फ़ाइल एक्सटेंशन कैसे बदलता हूं।

rename "s/oldExtension/newExtension/" *.txt

(यह पर्ल renameकमांड है, util-linuxएक नहीं है । देखें कि डेबियन / उबंटू पर नाम बदलने की उपयोगिता सेंटोस की तरह अन्य वितरणों की तुलना में अलग क्यों है? )


10
स्वीकृत उत्तर की तुलना में बहुत सरल है, धन्यवाद!
BTK

8
मैक पर मैं काम करने में सक्षम था brew install renameऔर इसे प्राप्त करता था।
मोंकपिट

3
मछली खोल के साथ आप कर सकते हैं rename "s/oldExtension/newExtension/" **.txtनाम बदलने के लिए सब * रिकर्सिवली .txt
Palmstrom

3
इसके लिए असफल रहेंगे footxt.txt। इसके स्थान पर इसका प्रयोग करें: unix.stackexchange.com/questions/19654/…
wisbucky

7
जब आपकी फ़ाइलों का कोई विस्तार नहीं होता है और आप एक जोड़ना चाहते हैं:rename 's/$/.txt/' *
mkataja

34

एक साधारण कमांड, renameसेutil-linux , आपके लिए ऐसा होगा, यह "txt" की हर घटना को "* .txt" से मेल खाती हुई सभी फ़ाइल में "टेक्स्ट" में बदल देगा।

rename txt text *.txt

4
renameपहली घटना में परिवर्तन है, तो बेहतर है कि rename .txt .text, लेकिन यह अभी भी हमेशा काम नहीं होगा (जैसे यह नाम बदलता है foo.txtx.bar.txtकरने के लिए foo.textx.bar.txt)।
गिल्स

12
यह ध्यान दिया जाना चाहिए कि सभी प्रणालियों का नाम बदलने का एक ही संस्करण नहीं है; डेबियन और दोस्तों पर, renameकमांड वास्तव में है perl-renameऔर पर्ल रीगेक्स का उपयोग करता है। उसके लिए, समतुल्य कमांड होगी rename 's/.txt/.text/' *.txt:। लोगों को man renameअपने सिस्टम पर पता लगाना चाहिए कि उनके पास कौन सा है।
ईविल

@evilsoup OSX, thx
डेवी लीमा

यह Cygwin (Windows)
andy

27
rename "s/oldExtension/newExtension/" *.txt

ऊपर ठीक काम करता है लेकिन वर्तमान निर्देशिका तक सीमित है। नीचे दिए गए कमांड का प्रयास करें, जो उप-निर्देशिकाओं के साथ लचीला है। यह .txtएक नया एक्सटेंशन के साथ निर्देशिका संरचना के तहत सभी फ़ाइलों का नाम बदलेगा।

find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \;

2
renameतर्क के रूप में कई फाइलों को संभाल सकते हैं, अगर आप ऐसी कई फाइलें हैं तो +इसके बजाय चीजों का उपयोग करके गति बढ़ा सकते \;हैं
एंथन

फिर भी, यह एक उपयोगी विकल्प है क्योंकि "* .txt" शेल द्वारा असमर्थित एक बड़ी तर्क सूची में अनियंत्रित हो सकता है।
रोमन शापोवालोव

1
"s / oldExtension / newExtension /" के लिए विफल हो जाएगा footxt.txt। इसके बजाय इसका उपयोग करें: unix.stackexchange.com/questions/19654/…
wisbucky


9

यहाँ संदर्भित उत्तर s/oldExtension/newExtension/गलत हैं। आप का उपयोग करते हैं s/txt/text/, तो आप बदल जाएगा footxt.txtकरने के लिए footext.txtहै, जो है कि तुम क्या नहीं करना चाहता। यहां तक ​​कि अगर आप उपयोग करते हैं s/.txt/.text/, तो यह परिवर्तित footxt.txtहो जाएगा fo.text.txt

आपको \.अवधि का मिलान करने के लिए उपयोग करना .होगा ( किसी भी चरित्र से मेल खाएगा)। और रेखा $के अंत का मिलान करने के लिए अनुगामी । केवल यह विस्तार से ठीक से मेल खाएगा।

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old

7

@Prince जॉन वेस्ले के उत्तर के आधार पर, यहां से वर्तमान निर्देशिका में फ़ाइलों के सभी एक्सटेंशन को बदलने के लिए एक सरल बैश स्क्रिप्ट ext1है ext2। फ़ाइलों के नाम भी आउटपुट किए जाते हैं।

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done

उदाहरण का उपयोग (स्क्रिप्ट का नाम मानते हुए change-ext):

change-ext ext1 ext2

निर्देशिका में फ़ाइलों के एक्सटेंशन को पुनरावर्ती रूप से बदलने के लिए, दूसरी पंक्ति ( for...) को दो पंक्तियों के साथ बदलें : shopt -s globstarऔर for f in **/*.$1। बैश 4+ की आवश्यकता है।
डेनिस गोलोमेज़ोव

4

कारण # 53 zsh पर स्विच करने के लिए:

zmv '(*).txt' '$1.text'


3

मान लीजिए कि आपकी फाइलें विभिन्न निर्देशिका में बिखरी हुई हैं, मान लें कि dirx आपकी मूल निर्देशिका है, तो यह खोज का उपयोग करके कार्य कर सकती है:

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done

क्या tcsh के बारे में ..
जोसेफ क्लिमुक

2

यह मेरे लिए काम करता है:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;

1
कृपया एक जोड़ दें। "पाठ" से पहले
danielmhanover

2

जब आप

स्रोत फ़ाइलों के लिए एक्सटेंशन नहीं है

और लक्ष्य का विस्तार है आप इसे इस तरह से करेंगे -

for f in *; do mv -- "$f" "${f%.\*}.text"; done

1
बेहतरीन बाश-देशी स्क्रिप्ट। बढ़िया काम किया! for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
तमसुराजॉय

1

मामले में आप जानना चाहते हैं कि आपके संस्करण में क्या गलत हुआ था: आपने बेसनेम कमांड के $filesबजाय उपयोग किया $xथा। तो यह काम करना चाहिए (हालांकि, हालांकि):

for x in *.txt
do
  mv "$x" "`basename '$x' .txt`.text"
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.