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

वही करता है जो आप चाहते हैं।





file-rename