2012-04-18 10 views
11

पर एकाधिक फ़ाइलों का नाम बदलें (या उपसर्ग हटाएं) मैं वर्तमान फ़ोल्डर में सभी फाइलों के नामों को बदलने की कोशिश कर रहा हूं और मैं फ़ाइलों को उपसर्ग (प्रत्येक फ़ाइल में एक सामान्य उपसर्ग है) को हटाकर इसे प्राप्त करने का प्रयास कर रहा हूं या अपने नामों को उनकी गिनती में बदलना (यदि 5 फाइलें हैं, तो फ़ाइल नाम 1.txt 2.txt 3.txt 4.txt 5.txt होगा)।प्रत्येक व्यक्ति को

अब मुझे cmd में रेन कमांड मिला है और इसके साथ खेला गया है लेकिन अब तक मैं परिणाम प्राप्त करने में सक्षम नहीं था और मैं इसे केवल cmd में चला सकता हूं, इसलिए कोई बैच फ़ाइलों का उपयोग नहीं किया जा सकता है।

यह सबसे करीब है कि मुझे मिल गया है, लेकिन यह केवल एक उपसर्ग जोड़ता है:

FOR %f IN (*.*) DO ren prefix%f %f 

लेकिन निश्चित रूप से, मैं इतना काम नहीं किया:

FOR %f IN (*.*) DO ren %f prefix%f 

मैं विपरीत कर की कोशिश की है अब मदद के लिए पूछ रहा हूं और यदि संभव हो तो कुछ स्पष्टीकरण (मुझे यह समझना अच्छा लगता है कि ये चीजें कैसे काम करती हैं)। किसी भी सहायता के लिए अग्रिम रूप से धन्यवाद।

+0

ये आदेश बहुत बड़ी निर्देशिकाओं के साथ अच्छी तरह से काम नहीं करते हैं। यह उन फ़ाइलों को उपसर्ग जोड़ता रहता है जो इसे पहले से ही उपसर्ग जोड़ते हैं। – hnviet

उत्तर

24

मुझे समझ में नहीं आता कि आप बैच फ़ाइल का उपयोग क्यों नहीं कर सकते हैं। लेकिन यहां एक समाधान है जो अधिकांश फ़ाइल नामों के साथ काम करना चाहिए।

क्रिटिकल - पहले क्या आप वाकई एक अपरिभाषित चर नाम है बनाना चाहिए, मैं fname

set "fname=" 

अगला आदेश को वास्तव में नाम करना है इस्तेमाल करेंगे। अगर fname पहले ही परिभाषित किया गया है तो यह ठीक से काम नहीं करेगा।

for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%") 

fname चर प्रत्येक यात्रा के लिए परिभाषित किया गया है और उसके बाद वाक्य रचना %fname:*prefix=% कुछ भी नहीं के साथ "उपसर्ग" की पहली आवृत्ति बदल देता है। मुश्किल बात यह है कि विंडोज़ पहले सबसे पहले पार्स किए जाने पर% fname% का विस्तार करने का प्रयास करता है। बेशक यह काम नहीं करेगा क्योंकि इसे अभी तक परिभाषित नहीं किया गया है। कमांड लाइन पर जब चर नहीं मिला तो पर्सेंट संरक्षित होते हैं। कॉल के बाद एक अतिरिक्त विस्तार चरण का कारण बनता है जो चर सेट किया गया है, इसलिए विस्तार कार्य करता है।

यदि आदेश चलाने से पहले fname परिभाषित किया गया है, तो यह लूप के भीतर असाइन किए गए मान के बजाय प्रत्येक पुनरावृत्ति के लिए उसी फ़ाइल का नाम बदलने का प्रयास करेगा।

यदि आप एक अलग उपसर्ग के साथ फिर से आदेश को चलाने के लिए चाहते हैं, तो आपको पहले परिभाषा को फिर से साफ़ करना होगा।

संपादित - यहाँ एक बैच "RemovePrefix.bat" उस काम

::RemovePrefix.bat prefix fileMask 
@echo off 
setlocal 
for %%A in ("%~1%~2") do (
    set "fname=%%~A" 
    call ren "%%fname%%" "%%fname:*%~1=%%" 
) 

मान लीजिए आप फ़ाइलों तो आप

RemovePrefix "prefix" "*.txt" 
को क्रियान्वित करते हुए स्क्रिप्ट का प्रयोग करेंगे "prefixName.txt" की तरह नाम दिया था, करता है नाम की फ़ाइल है

बैच फ़ाइल आपकी वर्तमान निर्देशिका में फ़ाइलों का नाम बदल जाएगी। बैच फ़ाइल को आपकी वर्तमान निर्देशिका में भी तब तक होना होगा जब तक कि बैच फ़ाइल उस निर्देशिका में मौजूद न हो जो आपके PATH चर में है। या जब आप इसे कॉल करते हैं तो आप बैच फ़ाइल के लिए पूर्ण पथ निर्दिष्ट कर सकते हैं।

बैच फ़ाइल में विस्तार के नियम अलग-अलग हैं।चर के लिए% ए के बजाय %% ए के रूप में संदर्भित किया जाना चाहिए, और %% fname %% को प्रारंभ में विस्तारित नहीं किया गया है, इसके बजाय डबल पर्सेंट को एकल पर्सेंट में परिवर्तित किया जाता है और फिर कॉल के बाद% fname% का विस्तार किया जाता है। इससे कोई फर्क नहीं पड़ता कि fname पहले से ही बैच फ़ाइल के साथ परिभाषित किया गया है। SETLOCAL बैच फ़ाइल में अस्थायी (स्थानीय) fname की परिभाषा बनाता है।

+0

बिल्कुल सही, अतिरिक्त स्पष्टीकरण के लिए भी बहुत बहुत धन्यवाद! संपादित करें: बस एक अतिरिक्त अनुरोध के रूप में, यदि आप बैच फ़ाइल में किए जा सकते हैं तो क्या आप एक उदाहरण पोस्ट कर सकते हैं? – Shadow

+0

मुझे नहीं पता कि यह कैसे सही था - एक बुरा बग था जहां% f% fname% में% f के साथ भ्रमित हो रहा था। सभी अब तय किए गए हैं :) – dbenham

+0

इस स्क्रिप्ट में मुझे क्या संशोधन करना चाहिए जैसे कि यह वर्तमान निर्देशिका की प्रत्येक बाल निर्देशिका में '.txt" 'की खोज करता है और दिए गए 'उपसर्ग' को हटा देता है? – Kushal

23

एक बहुत सरल समाधान
https://superuser.com/a/871799/497147

में प्रदान की जाती है मैं इसे यहाँ आसान पहुँच के लिए कॉपी किया गया।

इसके लिए जटिल स्क्रिप्ट के बारे में भूल जाओ।

rename एक बहुत पुराना और कभी भी ठीक से पूरा आदेश नहीं है। यदि आप इसे सही तरीके से उपयोग नहीं करते हैं, तो परिणाम आपको आश्चर्यचकित कर सकता है।

उदाहरण आदेश प्राप्त करने के लिए abcd1.txt, abcd2.txt, abcd3.txt आदि से एक उपसर्ग abcd को दूर करने के लिए 1.txt, 2.txt, 3.txt बस का उपयोग

rename "abcd*.txt" "////*.txt" 

आप प्रारंभिक वर्णों की संख्या के रूप में / का एक ही नंबर की आवश्यकता आप हटाना चाहते हैं।

दोनों तर्कों के लिए डबल कोट्स रखें।

+0

के लिए/R विकल्प जोड़ने की आवश्यकता है। –

+0

बहुत ठंडा और विचित्र तकनीक। मैंने अपना अपडेट किया है [Windows RENAME कमांड वाइल्डकार्ड की व्याख्या कैसे करता है?] (Https://superuser.com/q/475874/109090) सुपरयूसर क्यू एंड ए इस जानकारी के साथ, हालांकि तकनीकी रूप से, '/' जंगली के रूप में काम नहीं कर रहा है कार्ड। – dbenham

+0

अविश्वसनीय रूप से सरल और पूरी तरह से काम कर रहा है। ध्यान दें कि मिलान अभिव्यक्ति में कितने वर्ण निर्दिष्ट हैं "/" की संख्या से संबंधित नहीं है। एक और उदाहरण: 'नाम बदलें" आईएम *। * "" ////*.* "' 2-चार उपसर्ग पर मिलान कर रहा है और 4 वर्णों को हटा रहा है – PaoloC