एक फ़ाइल को 200 बार नए नामों से कॉपी और पेस्ट करें


3

मेरे पास एक फ़ोल्डर है जिसका नाम है: 'template.xlsx'और सैकड़ों फाइलें नाम:

  • old_2301 Item 1.xlsx
  • old_2014 Item 2.xlsx
  • old_5321 Item 3.xlsx
  • ...
  • old_3212 Item 200.xlsx

मैं फ़ाइल की प्रतिलिपि बनाना चाहता हूं template.xksxऔर 200 नई फाइलें बनाना चाहता हूं :

  • 2301 Item 1.xlsx
  • 2014 Item 2.xlsx
  • 5321 Item 3.xlsx
  • 3212 Item 200.xlsx

मैंने कुछ इस तरह की कोशिश की है:

फ़ोल्डर में, टाइप Shift+ राइट शिफ्ट: "ओपन कमांड-विंडो यहाँ" चुनें

for %a in (*.*) do copy "template.xlsx" ... ren ...?

मैं कॉपी की गई template.xlsxफ़ाइलों को अन्य फ़ाइलों के समान नाम देना चाहता हूं , लेकिन old_छंटनी के साथ ।

क्या ऐसा करने के लिए एक सरल तरीका है?


4
जब तक आपको ऐसा करने वाले कोड को पुनर्वितरित करने की आवश्यकता नहीं है, मैं दृढ़ता से कुछ पायथन सीखने का सुझाव दूंगा। कोड बहुत सरल है, इसलिए लिखने के लिए तेज़, पढ़ने में आसान और बग के लिए कम प्रवण है। मेरे पास सहकर्मियों को बैश में फैंसी सामान करने की कोशिश है, यह आमतौर पर सिरदर्द में समाप्त होता है।
डेविड एम्ह

5
@Davidmh जब एक बैच फ़ाइल के लिए एक तुच्छ कार्य है तो अजगर क्यों सीखें? इसके अलावा, विंडोज 7 अजगर या बैश स्थापित के साथ नहीं आता है।
DavidPostill

@DavidPostill मेरी बात यह है कि पायथन में यह आसान है, अधिक पठनीय है, और अधिक आसानी से विस्तारित है, एक नई भाषा के एक छोटे से सीखने की लागत पर (इस स्तर पर, ओपी जैसे सक्षम प्रोग्रामर के लिए आसान होना चाहिए), और स्थापित करना यह (जो काफी आसान है, अगर आप इसे वितरित करने के बारे में परवाह नहीं करते हैं)। और जबकि मूल कार्य तुच्छ हो सकता है, मेरे अनुभव में लोग इसे विस्तारित करने की कोशिश करेंगे, इसे आकस्मिक रूप से और अधिक जटिल बना देंगे, और अजीब और सेड (या विंडोज पर जो कुछ भी बराबर हैं) की भयानक गड़बड़ी में समाप्त हो सकते हैं, जबकि पायथन को वश में करने में मदद करता है जटिलता।
डेविड एमएच

इसके अलावा, मैं बैश की सिफारिश नहीं कर रहा हूं, मैं इसे उसी श्रेणी में बैच के रूप में मानता हूं। मैंने इसका उल्लेख किया क्योंकि मेरे साथी और मेरे लिनक्स पर काम करते हैं।
डेविड एमएच

@Davidmh मुझे विंडोज शॉप में पायथन का उपयोग करने का कोई कारण नहीं दिख रहा है। PowerShell एक ही "सीखने में आसान" के रूप में बहुत कुछ प्रदान करता है, लेकिन अधिक पोर्टेबल है (विस्टा + स्क्रिप्ट के साथ काम करना चाहिए) और सिंटैक्स IMO और भी बेहतर है।
ऑस्टिन टी फ्रेंच

जवाबों:


10

मैं हटाए जाने के template.xlsxसाथ अन्य फ़ाइलों के नाम पर प्रतिलिपि बनाना चाहता हूंold_

निम्न बैच फ़ाइल का उपयोग करें:

@echo off
setlocal enabledelayedexpansion
rem get list of file names
for /f "usebackq tokens=*" %%i in (`dir /b old_*.xlsx`) do (
  rem save the filename
  set _name=%%i
  rem remove old_ from the name
  set _name=!_name:old_=!
  rem do the copy to the modified name
  copy "template.xlsx" "!_name!"
  )
endlocal

आगे की पढाई


मुझे यह कोड कहां लिखना चाहिए? मैं यह कोड कैसे चलाऊं?
मैं

@DonkeyKingandDonkeyKing एक बैच फ़ाइल में, जो ब्याज की निर्देशिका में हो सकती है। फिर बैच फ़ाइल चलाएँ।
DavidPostill

@DonkeyKingandDonkeyKing मामले में आप बैच फ़ाइल बनाना नहीं जानते: आप टेक्स्ट एडिटर (नोटपैड, नोटपैड ++ या जो भी आपको पसंद है) में टाइप / पेस्ट कर सकते हैं और 'filename.bat'इसके बजाय इसे सेव कर सकते हैं 'filename.txt'। तब आप बस डबल-क्लिक कर सकते हैं और इसे निष्पादित कर सकते हैं जैसे कि यह एक नियमित कार्यक्रम (.exe) था।
स्टिव ग्रिफ़िन


6

आपको old_*अपने नाम स्रोत के रूप में नामित फ़ाइलों का उपयोग करना होगा और अंडरस्कोर पर विभाजित करना होगा।

@Echo off
For /f "tokens=1* delims=_" %%A in (
    'Dir /B /A-D "old_* Item *.xlsx"'
) Do Echo Copy template.xlsx "%%B"

यदि आउटपुट दिखता है, तो कॉपी के सामने ईको हटा दें।

/ च विकल्पों के लिए पार्सिंग की व्याख्या करना:

फ़ाइल नाम old_2301 आइटम 1.xlsx
डीलिम्स _
टोकन 1 _ * (बाकी)
वार %% ए %% बी के लिए

बैच के बिना कमांड लाइन के लिए एक प्रकार:

For /f "tokens=1* delims=_" %A in ('Dir /B /A-D "old_*.xlsx"') Do Copy template.xlsx "%B"

मुझे लगता है कि यह एक आकर्षण के रूप में काम करता है, लेकिन मैंने डेविड के जवाब का उपयोग करके समाप्त कर दिया, इसलिए मैंने उनकी :) वैसे भी धन्यवाद स्वीकार किया! :)
स्टिव ग्रिफिन

Speedwiese में कोई बड़ा अंतर नहीं है क्योंकि कॉपी में अधिकांश समय लगेगा। एक cmd लाइन संस्करण जोड़ा गया, कोई बैच की जरूरत है तो।
लोटपिंग्स

4

जब तक मैं वास्तव में एक कार्यक्रम चाहता था जिसे मैं बार-बार चला सकता था, अगर यह सिर्फ एक-बंद या कुछ-कुछ बंद है, तो मैं नोटपैड ++ या किसी अन्य पाठ संपादक का उपयोग ब्लॉक कॉपी और पेस्ट के साथ करूंगा। संबंधित निर्देशिका और प्रकार में एक कमांड प्रॉम्प्ट खोलें dir/b > 1.txt, जिसके परिणामस्वरूप उदाहरण हैं:

D:\MiscJunk\1>type 1.txt
1.txt
old_2014 Item 2.txt
old_2301 Item 1.txt
old_5321 Item 3.txt
template.txt

नोटपैड ++ में 1.txt को एडिट करें और इनमें से कई लाइनों को आवश्यकतानुसार जोड़ें:

copy template.txt ""
copy template.txt ""
copy template.txt ""

ब्लॉक कॉपी (Alt Shift तीर कुंजी) पाठ:

2014 Item 2.txt
2301 Item 1.txt
5321 Item 3.txt

और इसे उद्धरणों के बीच चिपकाएँ:

copy template.txt "2014 Item 2.txt"
copy template.txt "2301 Item 1.txt"
copy template.txt "5321 Item 3.txt"

फिर आदेशों की जाँच करने के बाद सही हो जाता है और उसी के अनुसार समायोजन होता है, बस उन कमांडों को कमांड प्रॉम्प्ट में कॉपी और पेस्ट करें, जिसके परिणामस्वरूप:

D:\MiscJunk\1>dir/b
2014 Item 2.txt
2301 Item 1.txt
5321 Item 3.txt
...

यह विधि अति सरल है जिसमें कोई डीबगिंग की आवश्यकता नहीं है, और बहुत कम है जो गलत हो सकता है। नोटपैड ++ में कमांड के ब्लॉक को दस्तक देना कुछ ऐसा है जो मैं नियमित रूप से करता हूं।


मैंने पहले डेविड की विधि का उपयोग किया, लेकिन यह पता चला कि मुझे उन्हें फिर से नाम बदलना पड़ा ... यह दूसरी बार सही था :) बहुत बहुत धन्यवाद!
स्टिव ग्रिफिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.