जवाबों:
एक बेहतर समाधान के लिए (बाहरी कॉल के विपरीत केवल बैश कार्यक्षमता के साथ), अन्य उत्तरों में से एक देखें ।
निम्नलिखित को rename
प्रोग्राम करने के लिए सिस्टम की आवश्यकता नहीं होगी और (हालांकि आपके पास सिस्टम पर यह अक्सर होता है):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
संपादित करें: जैसा कि टिप्पणियों में कहा गया है, यह उचित उद्धरण (अब ऊपर जोड़ा) के बिना उन में रिक्त स्थान के साथ फ़ाइल नाम के लिए काम नहीं करता है। जब आप जानते हैं कि आपकी फ़ाइल में स्थान नहीं है, तो यह पूरी तरह से काम करेगा लेकिन जब भी आप ऐसा कुछ लिखेंगे, जिसका बाद में पुन: उपयोग किया जा सकता है, तो उचित उद्धरण छोड़ें नहीं।
ren *.a *.b
$()
विरासत बैकटिक सिंटैक्स के बजाय POSIX- निर्दिष्ट का उपयोग करें । पठनीयता में सुधार करता है, और वाक्यविन्यास को बहुत कम अस्पष्ट बना देता है जब आपके पास ऐसे चरित्र होते हैं जिन्हें बाद वाले के साथ कमांड प्रतिस्थापन के अंदर शाब्दिक होने के लिए बैकस्लैश-बचना होगा।
यदि बैश का उपयोग किया जाता है, तो बाहरी कमांड जैसे कि sed, basename, rename, expr, आदि की कोई आवश्यकता नहीं है।
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
"${file%.*}.txt"
, लेकिन यह फ़ाइलों के लिए खतरनाक हो सकता है / w सब पर एक एक्सटेंशन।
$
घुंघराले ब्रेसिज़ के अंदर नहीं है!
--
"ऑपरेटर": mv - "$ फ़ाइल" "$ {फ़ाइल% .html} .txt" का उपयोग करके भी। यह ऑपरेटर फ़ाइल नाम को रोकता है जो इसके साथ शुरू होता है। a '-' से तर्कों के रूप में mv द्वारा पार्स किया जा रहा है।
rename 's/\.html$/\.txt/' *.html
वास्तव में आप क्या चाहते हैं।
इसने मेरे लिए OSX पर .txt से .txt_bak तक काम किया
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
.txt
लिए .txt_bak
_bak
.scss
का नाम बदलकर .sass
(इन-प्लेस रूपांतरण के बाद ...):find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
आप उपयोग करना चाहते हैं rename
:
rename -S .html .txt *.html
यह ठीक करता है कि आप क्या चाहते हैं - यह से विस्तार बदल जाएगा .html
करने के लिए .txt
सभी मिलते-जुलते फ़ाइलों के लिए *.html
।
नोट: ग्रेग हेविल सही ढंग से बताते हैं कि यह बैश बिलिन नहीं है; और एक अलग लिनक्स कमांड है। यदि आपको लिनक्स पर कुछ चाहिए तो यह ठीक काम करना चाहिए; यदि आपको कुछ और क्रॉस-प्लेटफ़ॉर्म की आवश्यकता है, तो अन्य उत्तरों में से एक पर एक नज़र डालें।
rename
कार्यक्रम संबंधित नहीं है bash
और सभी प्लेटफार्मों पर भी उपलब्ध नहीं है। मैंने इसे केवल लिनक्स पर देखा है।
rename -S .html .text *.html
जगह है जिसके लिए -S
खड़ा है--subst-all
उबंटू उपयोगकर्ताओं के लिए:
rename 's/\.html$/\.txt/' *.html
यहाँ पुनर्नामित आदेश का एक उदाहरण दिया गया है:
rename -n ’s/\.htm$/\.html/’ *.htm
-N का मतलब है कि यह एक टेस्ट रन है और वास्तव में किसी भी फाइल को नहीं बदलेगा। यह आपको उन फ़ाइलों की एक सूची दिखाएगा, जिन्हें यदि आपने -n हटा दिया है, तो उसका नाम बदल दिया जाएगा। उपरोक्त मामले में, यह .htm की फ़ाइल एक्सटेंशन से वर्तमान निर्देशिका में सभी फ़ाइलों को .html में बदल देगा।
यदि उपरोक्त परीक्षण रन का आउटपुट ठीक लगा, तो आप अंतिम संस्करण चला सकते हैं:
rename -v ’s/\.htm$/\.html/’ *.htm
-V वैकल्पिक है, लेकिन इसे शामिल करने के लिए यह एक अच्छा विचार है क्योंकि यह एकमात्र रिकॉर्ड है जो आपके पास परिवर्तन के नाम से होगा जो कि नीचे दिए गए नमूना आउटपुट में दिखाया गया है:
$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html
बीच में मुश्किल हिस्सा नियमित अभिव्यक्ति के साथ एक पर्ल प्रतिस्थापन है, जो नीचे दिया गया है:
rename -v ’s/\.htm$/\.html/’ *.htm
इस सवाल में स्पष्ट रूप से बैश का उल्लेख है, लेकिन अगर आपके पास ZSH उपलब्ध है तो यह बहुत आसान है:
zmv '(*).*' '$1.txt'
यदि आप मिलते हैं zsh: command not found: zmv
तो बस चलाएं:
autoload -U zmv
और फिर दोबारा कोशिश करें।
Zmv के बारे में इस मूल लेख के लिए धन्यवाद ।
किसी और की वेबसाइट के क्रॉल होने के बाद, मैंने उपनिर्देशिका के एक विस्तृत वृक्ष के बीच .html एक्सटेंशन को गायब करने वाली हजारों फ़ाइलों को समाप्त कर दिया।
उन सभी को एक शॉट में नाम बदलने के लिए, जिनके पास पहले से ही एक .html एक्सटेंशन है (उनमें से अधिकांश में कोई भी नहीं था) को छोड़कर, इसके लिए यह आवश्यक है:
cd wwwroot
find . -xtype f \! -iname *.html -exec mv -iv "{}" "{}.html" \; # batch rename files to append .html suffix IF MISSING
ओपी के मामले में, मैं इसे थोड़ा संशोधित कर सकता हूं, केवल * .txt फ़ाइलों का नाम बदलने के लिए, जैसे:
find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} \;
टूट गया (हथौड़ा!):
-iname * .txt
- मतलब केवल .txt में पहले से ही समाप्त हो रही फ़ाइलों पर विचार करें
mv -IV "{} {txt, एचटीएमएल}।" - जब खोज गुजरता {} फ़ाइल नाम के रूप में एक, $ {। फ़ाइल नाम% *} अपने basename किसी भी विस्तार के बिना करने के लिए मानकों के रूप में निकालता है mv । बैश को दो मापदंडों के रूप में फिर से लिखने के लिए {txt, html} लेता है ताकि अंतिम कमांड निम्नानुसार चले:mv -iv "filename.txt" "filename.html"
हालांकि फिक्स की जरूरत है: फ़ाइल नाम में रिक्त स्थान के साथ काम करना
आदेशmmv
(एक दूसरे में हजारों की संख्या में) फ़ाइलों की एक बड़ी संख्या पर बहुत कुशलता से यह काम पूरा कर रहा है। उदाहरण के लिए, सभी .xml
फ़ाइलों को .html
फ़ाइलों का नाम बदलने के लिए , इसका उपयोग करें:
mmv ";*.xml" "#1#2.html"
;
पथ से मेल खाएगी, *
फ़ाइल नाम से मेल खाते हैं, और ये भी कहा जाता है #1
और #2
प्रतिस्थापन नाम पर।
exec
या पाइप पर आधारित उत्तर या तो बहुत धीमी गति से या बहुत बड़ी संख्या में फाइलों में विफल रहे।
पार्टी करने में थोड़ी देर हो गई। आप इसे xargs के साथ कर सकते हैं:
ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}
या अगर आपकी सभी फाइलें किसी फोल्डर में हैं
ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}
ls
। यह आदेश हास्यास्पद है: यह बेकार के साथ ls
सीधे ग्लोब का उपयोग करने के बजाय एक ग्लोब का उपयोग करता है । यह रिक्त स्थान, उद्धरण और (उद्धरण चिह्नों की कमी के कारण) युक्त ग्लोब पात्रों के साथ टूट जाएगा।
एक बार में कई एक्सटेंशन संशोधित करने का यह एक अच्छा तरीका है:
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
नोट: एक ही होने के लिए विस्तार आकार में सावधान रहें (???)
यदि आप पेरल को पसंद करते हैं, तो एक छोटी सी पेरेल स्क्रिप्ट है (मूल रूप से लैरी वॉल, जिसे पेरल के निर्माता ने लिखा है) जो आप यहाँ चाहते हैं, वही करेंगे: tips.webdesign10.com/files/rename.pl.txt ।
अपने उदाहरण के लिए निम्नलिखित कार्य करना चाहिए:
rename.pl 's/html/txt/' *.html
एक पंक्ति, कोई छोर नहीं:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
उदाहरण:
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json ac8453e2-0d82-4d43-b80e-205edb754700.json
$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt ac8453e2-0d82-4d43-b80e-205edb754700.txt
दुर्भाग्य से यह मामूली रूप से करने के लिए तुच्छ नहीं है। आप शायद expr जादू की एक बिट की जरूरत है।
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
एक बार जब आप खुश होते हैं तो इसे हटा दें जो आप चाहते हैं।
संपादित करें: basename
शायद इस विशेष मामले के लिए थोड़ा अधिक पठनीय है, हालांकि expr
सामान्य रूप से अधिक लचीला है।
यहाँ मैं क्या करने के लिए .edge
फ़ाइलों का नाम बदलने के लिए इस्तेमाल किया है.blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
आकर्षण जैसा काम करता है।
आप बैश में एक समारोह भी बना सकते हैं, इसे .bashrc
या कुछ और जोड़ सकते हैं और फिर इसे जहां चाहें उपयोग कर सकते हैं।
change-ext() {
for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}
उपयोग:
change-ext css scss
समारोह में कोड का स्रोत: https://stackoverflow.com/a/1224786/6732111
किसी भी अन्य पैकेज के बिना वर्तमान निर्देशिका और उप निर्देशिका के तहत सभी फ़ाइलों के लिए फ़ाइल एक्सटेंशन का नाम बदलें (केवल शेल स्क्रिप्ट का उपयोग करें):
rename.sh
निम्नलिखित कोड के साथ वर्तमान निर्देशिका के तहत एक शेल स्क्रिप्ट बनाएं :
#!/bin/bash
for file in $(find . -name "*$1"); do
mv "$file" "${file%$1}$2"
done
इसे चलाएं ./rename.sh .old .new
।
उदाहरण के लिए। ./rename.sh .html .txt