bash - कहत - वर्डपैड एक्सटेंशन नाम
मैं फाइलों के बैच के लिए एक्सटेंशन का नाम कैसे बदलूं? (11)
एक निर्देशिका में, मेरे पास *.html
फ़ाइलों का एक गुच्छा है।
मैं उन्हें सभी *.txt
बदलना चाहता हूं
मैं बैश खोल का उपयोग करता हूं।
आप rename
का उपयोग करना चाहते हैं:
rename -S .html .txt *.html
यह वही करता है जो आप चाहते हैं - यह *.html
मेल खाने वाली सभी फ़ाइलों के लिए .html
से .txt
तक एक्सटेंशन को बदल देगा।
नोट: ग्रेग हेगिल सही तरीके से इंगित करता है कि यह एक बैश बिल्टिन नहीं है; और एक अलग लिनक्स कमांड है। अगर आपको लिनक्स पर कुछ चाहिए तो इसे ठीक काम करना चाहिए; अगर आपको कुछ और क्रॉस-प्लेटफॉर्म चाहिए तो दूसरे उत्तरों में से एक को देखें।
इसे इस्तेमाल करे
rename .html .txt *.html
उपयोग:
rename [find] [replace_with] [criteria]
एक बेहतर समाधान के लिए (बाहरी कॉल के विपरीत, केवल बैश कार्यक्षमता के साथ), अन्य उत्तरों में से एक देखें।
निम्नलिखित करेंगे और सिस्टम को rename
कार्यक्रम की आवश्यकता नहीं है (हालांकि आप इसे अक्सर सिस्टम पर रखते हैं):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
संपादित करें: टिप्पणियों में बताया गया है, यह उचित उद्धरण के बिना रिक्त स्थान के साथ फ़ाइल नामों के लिए काम नहीं करता है (अब ऊपर जोड़ा गया है)। अपनी खुद की फाइलों पर पूरी तरह से काम करते समय जो आप जानते हैं कि फ़ाइल नामों में रिक्त स्थान नहीं हैं, यह काम करेगा, लेकिन जब भी आप कुछ लिखते हैं जिसे बाद में पुन: उपयोग किया जा सकता है, उचित उद्धरण को न छोड़ें।
किसी और की वेबसाइट क्रॉल होने के बाद, मैंने उपनिर्देशिका के विस्तृत पेड़ में .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} \;
टूटा हुआ (हथौड़ा!):
-नाम * .txt
- मतलब केवल पहले से ही .txt में समाप्त होने वाली फ़ाइलों पर विचार करें
mv -iv "{}। {txt, html}" - जब फ़ाइल नाम के रूप में {} पास होता है, $ {filename%। *} एमएस को पैरामीटर बनाने के लिए किसी भी एक्सटेंशन के बिना अपना बेसनाम निकालता है। bash {txt, html} को दो पैरामीटर के रूप में फिर से लिखने के लिए लेता है, इसलिए अंतिम कमांड mv -iv "filename.txt" "filename.html"
चलता है: mv -iv "filename.txt" "filename.html"
हालांकि आवश्यक फिक्स: फ़ाइल नामों में रिक्त स्थान से निपटना
नाम बदलें आदेश का एक उदाहरण यहां दिया गया है:
rename -n ’s/\.htm$/\.html/’ *.htm
-एन का मतलब है कि यह एक परीक्षण रन है और वास्तव में किसी भी फाइल को नहीं बदलेगा। यह आपको उन फ़ाइलों की एक सूची दिखाएगा जिनका नाम बदल दिया जाएगा यदि आपने -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
पार्टी के लिए थोड़ा देर हो चुकी है। आप इसे 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' - {}
यदि आप PERL पसंद करते हैं, तो एक छोटी सी PERL स्क्रिप्ट (जिसे लैरी वॉल, जिसे PERL के निर्माता, द्वारा लिखित रूप से लिखा गया है) जो ठीक वही करेगा जो आप यहां चाहते हैं: tips.webdesign10.com/files/rename.pl.txt । आपके उदाहरण के लिए निम्नलिखित चाल चलनी चाहिए
rename.pl 's/html/txt/' *.html
=)
(अद्यतन यूआरएल के लिए धन्यवाद @loretoparisi)
यदि बैश का उपयोग करते हैं, तो बाहरी आदेश जैसे कि sed, बेसनाम, नाम बदलें, expr, आदि की आवश्यकता नहीं है।
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
यह प्रश्न स्पष्ट रूप से बैश का उल्लेख करता है, लेकिन यदि आपके पास जेडएसएच उपलब्ध है तो यह बहुत आसान है:
zmv '(*).*' '$1.txt'
यदि आपको zsh: command not found: zmv
मिलता है zsh: command not found: zmv
तो बस चलाएं:
autoload -U zmv
और फिर पुन: प्रयास करें।
Zmv के बारे में टिप के लिए इस मूल आलेख के लिए धन्यवाद।
यहां है। मैं .edge
फ़ाइलों को .blade.php
पर पुनर्नामित करने के लिए उपयोग करता .blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
आकर्षण की तरह काम करता है।
rename 's/\.html$/\.txt/' *.html
वही करता है जो आप चाहते हैं।