फ़ाइलों को कॉपी करना जो एक पैटर्न से मेल खाते हैं लेकिन दूसरे से नहीं


0

मेरे पास कई फाइलें हैं जो इस तरह एक पैटर्न का पालन करती हैं:

<BaseName> . <Version> [ - <Tag> - <#> ] . <Extension>

उदाहरण के लिए:

basename.1.0.0.ext
basename.1.0.0-aaa-1.ext
basename.1.0.0-aaa-2.ext
basename.1.0.0-aaa-3.ext
basename.1.0.0-bbb-1.ext
basename.1.0.0-bbb-2.ext
basename.1.0.0-bbb-3.ext

अब मुझे एक सख्त लिखने की ज़रूरत है जो एक लक्ष्य फ़ोल्डर के एक निश्चित 'टैग' भाग (या कोई 'टैग') के साथ फ़ाइल को कॉपी करेगा। उदाहरण के लिए:

xcopy *-aaa-*.ext \\server\path /f /y

केवल 'आ' टैग वाली फाइलों की नकल करेगा। अब तक सब ठीक है।

समस्या मूल रूप से मैं सब कुछ है कि मेल खाता है की जरूरत है, स्क्रिप्ट भी कोई 'टैग' के साथ फ़ाइलों के लिए काम करने की जरूरत है *.ext सिवाय क्या से मेल खाता है *-*.ext

दुर्भाग्य से, मेरे पास यहां कई प्रतिबंध हैं:

  • मैं इन फ़ाइलों का नाम पैटर्न या स्थान बदलने में सक्षम नहीं हूं।
  • 'संस्करण' भाग ज्ञात नहीं है, इसलिए *.1.0.0.extकाम नहीं करेगा।
  • 'संस्करण' एक निश्चित लंबाई नहीं है, इसलिए *.?.?.?.extकाम नहीं करेगा।
  • xcopyपैरामीटर को बाहर करना केवल एक पैटर्न को स्वीकार नहीं करता है, केवल फाइलों की एक सूची है, इसलिए यह काम नहीं करेगा।
  • मैं इसके लिए बैच स्क्रिप्टिंग का उपयोग कर रहा हूं। पॉवरशेल को शामिल करना पूरी तरह से सवाल से बाहर नहीं है, लेकिन इसे काम करने के लिए उचित मात्रा में ओवरहेड की आवश्यकता होगी, इसलिए यदि संभव हो तो मैं इससे बचना चाहूंगा।
  • वास्तविक स्क्रिप्ट को इस तरह देखना होगा:

    xcopy "%SOURCE%" "%DEST%" /f /y
    

    और इस स्क्रिप्ट द्वारा उपयोग किए गए चर बाहरी कॉन्फ़िगरेशन फ़ाइल में सहेजे जाएंगे।

मैं इस स्क्रिप्ट को कैसे लिख सकता हूं ताकि यह किसी विशिष्ट 'टैग' और बिना किसी 'टैग' के किसी भी फाइल के साथ काम करे?

जवाबों:


1

foo.bat:

dir /b %3 > exclude_list.txt
xcopy %1 %2 /f /y /EXCLUDE:exclude_list.txt

अपने उदाहरण में बहिष्करण के लिए:

call foo.bat "C:\source\*.ext" "C:\destination\" "*-*.ext"

बिना किसी बहिष्करण के (अयोग्य अभिमानी) ":

call foo.bat "C:\source\*.ext" "C:\destination\" "A_STRING_THAT_CANNOT_MATCH"

रोबोकॉपी स्विच भी देखें/xf {filename}


+1 जवाब देने के लिए समय निकालने के लिए धन्यवाद। यह काम करेगा, लेकिन यह थोड़ा गड़बड़ लगता है। मैंने पहले कभी रोबोकॉपी का उपयोग नहीं किया है, लेकिन मैं इसे एक संभावना के रूप में देखूंगा। मैं अपने वर्तमान समाधान पर किसी भी टिप्पणी का स्वागत करता हूँ।
pswg

आपकी तुलना में कोई अधिक या कम गन्दा नहीं है, और दोनों के पास किसी बहिष्करण के मामले के लिए एक हैक है। अगर यह काम करता है, तो यह काम करता है। मेरे उदाहरण के लिए एक मामूली प्लस बहिष्करण सूची बाद में जांच की जा सकती है। (जाहिर है, call
परम

0

तो यह वही है जो मैं अभी उपयोग कर रहा हूं:

for /f "delims=" %%f in ('dir /b "*.ext" ^| findstr "%TAG%"') do (
    xcopy "%ff" %DEST% /f /y
)

इसलिए दिए गए टैग को कॉपी करने के लिए, आपको बस निर्दिष्ट करना होगा TAG=-aaa-, और आप रिक्त स्थान द्वारा अलग किए गए कई टैग भी निर्दिष्ट कर सकते हैं, जैसे TAG=-aaa -bbb-

नीचे की ओर यह है कि उन फ़ाइलों को तैनात करने के लिए जिनके पास टैग नहीं है, आपको वास्तव में बदसूरत जैसे कुछ करना होगा TAG=^[^-]*$। यद्यपि मैं इसे भविष्य में रिफ्लेक्टर कर सकता था ताकि /vध्वज को निर्दिष्ट करने के लिए एक चर भी लिया जा सके (जो कि व्यवहार को findstrप्रभावित करता है), लेकिन यह फिलहाल आवश्यक नहीं लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.