निर्देशिका संरचना की प्रतिलिपि कैसे बनाएं लेकिन केवल कुछ फ़ाइलों को शामिल करें (विंडोज़ बैच फ़ाइलों का उपयोग करके)


103

जैसा कि शीर्षक कहता है, मैं किसी निर्देशिका संरचना की पुनरावृत्ति कैसे कर सकता हूं लेकिन इसमें केवल कुछ फाइलें शामिल हैं। उदाहरण के लिए निम्न निर्देशिका संरचना दी गई है:

folder1
  folder2
    folder3
      data.zip
      info.txt
      abc.xyz
    folder4
    folder5
      data.zip
      somefile.exe
      someotherfile.dll

फ़ाइलें data.zip और info.txt निर्देशिका संरचना में हर जगह दिखाई दे सकती हैं। मैं पूर्ण निर्देशिका संरचना की प्रतिलिपि कैसे बना सकता हूं, लेकिन केवल data.zip और info.txt नाम की फाइलें शामिल हैं (अन्य सभी फाइलों को अनदेखा किया जाना चाहिए)?

परिणामी निर्देशिका संरचना इस तरह दिखनी चाहिए:

copy_of_folder1
  folder2
    folder3
      data.zip
      info.txt
    folder4
    folder5
      data.zip

जवाबों:


169

आप उल्लेख नहीं करते हैं कि यह केवल बैच होना है, लेकिन यदि आप उपयोग कर सकते हैं ROBOCOPY, तो यह प्रयास करें:

ROBOCOPY C:\Source C:\Destination data.zip info.txt /E

संपादित करें: खाली फ़ोल्डरों को शामिल /Sकरने के /Eलिए पैरामीटर बदल दिया ।


क्या मैं इस वाक्य रचना के साथ * .zip की प्रतिलिपि बना सकता हूं? मैंने डेटा के बजाय सिर्फ * .zip लिखने की कोशिश की। ज़िप, लेकिन यह केवल फ़ोल्डर्स की फाइलों की नकल नहीं करता था। मैंने भी कोशिश की??
जिप

@ नील ब्रिंच हां, आपको ऐसा करने में सक्षम होना चाहिए। आपके द्वारा उपयोग की जा रही सटीक कमांड लाइन क्या है?
एफोरिया

1
ROBOCOPY C: \ Source C: \ Destination * .zip / E
नील्स

अजीब। आप कौन सा ओएस उपयोग कर रहे हैं? क्या आपके पास आवश्यक फ़ाइल / फ़ोल्डर अनुमतियाँ हैं? मैंने सिर्फ विन 7 पर परीक्षण किया और *.zipमेरे लिए काम किया।
एफोरिया

वास्तव में!? मैं भी विन 7 का उपयोग कर रहा हूं। जब मैं कोशिश करता हूं, तो यह किसी भी फाइल को कॉपी नहीं करता है। केवल फ़ोल्डर। मैं फिर से कोशिश करता हूँ। (जब हम इस पर हैं, * .zip से अधिक शामिल करने के लिए वाक्यविन्यास क्या है
मान

29

एक वैकल्पिक समाधान जो एक बार में एक फ़ाइल की प्रतिलिपि बनाता है और उसे ROBOCOPY की आवश्यकता नहीं होती है:

@echo off
setlocal enabledelayedexpansion

set "SOURCE_DIR=C:\Source"
set "DEST_DIR=C:\Destination"
set FILENAMES_TO_COPY=data.zip info.txt

for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
    if exist "%%F" (
        set FILE_DIR=%%~dpF
        set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
        xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
    )
)

कथन के लिए बाहरी उपनिर्देशिका SOURCE_DIRऔर नाम में किसी भी संभव पथ संयोजन को उत्पन्न करता है FILENAMES_TO_COPY। प्रत्येक मौजूदा फ़ाइल के लिए xcopy लागू किया गया है। FILE_INTERMEDIATE_DIRफ़ाइल का उपनिर्देशिका पथ रखता है SOURCE_DIRजिसके भीतर बनाने की आवश्यकता है DEST_DIR


1
मुझे फ़ोल्डर और सबफ़ोल्डर से सभी फ़ोटो कॉपी करने की आवश्यकता थी, इस बैच स्क्रिप्ट ने मदद की। बस set FILENAMES_TO_COPY=data.zip info.txtऊपर की लाइन को बदल दिया गयाset FILENAMES_TO_COPY=*.jpg
काई नैक

मुझे एक त्रुटि मिल रही है क्योंकि फ़ाइल पथ पर इस पर रिक्त स्थान हैं (SOURCE_DIR = "C: \ Origin Test", DEST_DIR = "C: \ Dest Test", त्रुटि: Test "" इस क्षण अप्रत्याशित था)। मैंने% var% को बदलने की कोशिश की है! हर जगह, लेकिन सफलता के बिना। इसे कैसे हल किया जाए इस पर कोई सुराग? संपूर्ण संरचना रिक्त स्थान के साथ फ़ोल्डर नामों से भरा है।
ricardo.scholz

1
कोशिश करो set "SOURCE_DIR=C:\Origin Test"और set "DEST_DIR=C:\Dest Test"। दोहरे उद्धरण चिह्नों की नियुक्ति पर ध्यान दें।
सकर

13

cpio में खोज (यानी फ़ाइल पथ) का आउटपुट आउटपुट आज़माएं

find . -type f -name '*.jpg' | cpio -p -d -v targetdir/

cpio टारगेट फ़ाइलों पर टाइमस्टैम्प की जाँच करता है - इसलिए यह सुरक्षित और तेज़ है।

हटाने -v तेजी से सेशन के लिए, एक बार जब आप इसकी आदत हो जाती है।


2
@Christian इसमें cpio पर निर्भरता है जो मानक स्थापित का हिस्सा नहीं है।
क्रैश

8

यदि पॉवर्सशेल एक विकल्प है, तो आप यह कर सकते हैं:

Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurse

मुख्य नुकसान यह है कि यह सभी फ़ोल्डरों को कॉपी करता है, भले ही वे खाली हो जाएंगे क्योंकि आपके द्वारा निर्दिष्ट फिल्टर से कोई भी फाइल मेल नहीं खाती है। तो आप कुछ फ़ोल्डरों के अलावा खाली फ़ोल्डर से भरे पेड़ के साथ समाप्त हो सकते हैं, जो आपके पास आवश्यक फाइलें हैं।


इसे दूसरी बार चलाने से गंतव्य बदल जाएगा। (यह फ़ाइलों को सबफ़ोल्डर में रखता है।) यदि आप मुझसे पूछें तो यह एक मूर्खतापूर्ण व्यवहार है। rm -r -ErrorAction:SilentlyContinue d:\destinationPathजिसे ठीक करने के लिए आप कॉपी करने से पहले चलाना चाहेंगे ।
MakotoE

7

पिछले उत्तर के लिए धन्यवाद। :)

इस स्क्रिप्ट का नाम "r4k4copy.cmd" है:

@echo off
for %%p in (SOURCE_DIR DEST_DIR FILENAMES_TO_COPY) do set %%p=
cls
echo :: Copy Files Including Folder Tree
echo :: http://stackoverflow.com
rem     /questions/472692/how-to-copy
rem     -a-directory-structure-but-only
rem     -include-certain-files-using-windows
echo :: ReScripted by r4k4
echo.
if "%1"=="" goto :NoParam
if "%2"=="" goto :NoParam
if "%3"=="" goto :NoParam
setlocal enabledelayedexpansion
set SOURCE_DIR=%1
set DEST_DIR=%2
set FILENAMES_TO_COPY=%3
for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
if exist "%%F" (
set FILE_DIR=%%~dpF
set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
)
)
goto :eof
:NoParam
echo.
echo Syntax: %0 [Source_DIR] [Dest_DIR] [FileName]
echo Eg.   : %0 D:\Root E:\Root\Lev1\Lev2\Lev3 *.JPG
echo Means : Copy *.JPG from D:\Root to E:\Root\Lev1\Lev2\Lev3

यह "सोर्स", "डेस्टिनेशन" और "फाइलनेम" के वेरिएबल को स्वीकार करता है। यह केवल निर्दिष्ट प्रकार की फ़ाइलों या चयनात्मक फ़ाइलनामों की प्रतिलिपि बना सकता है।

किसी भी सुधार का स्वागत है। :)


5

केवल ढूँढें और cp के साथ:

mkdir /tmp/targetdir
cd sourcedir
find . -type f -name '*.zip' -exec cp -p --parents {} /tmp/targetdir ";"
find . -type f -name '*.txt' -exec cp -p --parents {} /tmp/targetdir ";"

4

पॉलियस के समाधान के समान, लेकिन जिन फ़ाइलों की आपको परवाह नहीं है उन्हें कॉपी नहीं किया गया है:

@echo OFF

:: Replace c:\temp with the directory where folder1 resides.
cd c:\temp

:: You can make this more generic by passing in args for the source and destination folders.
for /f "usebackq" %%I in (`dir /b /s /a:-d folder1`) do @echo %%~nxI | find /V "data.zip" | find /v "info.txt" >> exclude_list.txt
xcopy folder1 copy_of_folder1 /EXCLUDE:exclude_list.txt /E /I

4

सभी पाठ फ़ाइलों को G पर कॉपी करने के लिए: और निर्देशिका संरचना को संरक्षित करें:

xcopy *.txt /s G:

क्या यह कार्य पुनरावर्ती रूप से किया जा सकता है, सबफ़ोल्डर से सभी .txt को कॉपी करने और आधार निर्देशिका के सापेक्ष निर्देशिका संरचना को संरक्षित करने के लिए?
मिका

3

यह केवल दो सरल आदेश हैं, लेकिन मैं इसकी सिफारिश नहीं करूंगा, जब तक कि जिन फ़ाइलों की आपको प्रतिलिपि बनाने की आवश्यकता नहीं है, वे छोटे हैं। ऐसा इसलिए है क्योंकि यह सभी फ़ाइलों की प्रतिलिपि बनाएगा और फिर उन फ़ाइलों को हटा देगा जिनकी प्रतिलिपि की आवश्यकता नहीं है।

xcopy /E /I folder1 copy_of_folder1
for /F "tokens=1 delims=" %i in ('dir /B /S /A:-D copy_of_files ^| find /V "info.txt" ^| find /V "data.zip"') do del /Q "%i"

ज़रूर, दूसरी आज्ञा लंबे प्रकार की है, लेकिन यह काम करती है!

इसके अलावा, इस दृष्टिकोण के लिए आपको किसी भी तीसरे पक्ष के टूल को डाउनलोड और इंस्टॉल करने की आवश्यकता नहीं है (विंडोज 2000+ बैटच के पास इसके लिए पर्याप्त कमांड हैं)।


बहुत बहुत धन्यवाद। जैसा कि आपने उल्लेख किया है, यह आदर्श नहीं है, क्योंकि (मेरे मामले में) जो फाइलें कॉपी की जानी चाहिए, वे आमतौर पर छोटी होती हैं, जबकि जिन फाइलों की नकल नहीं की जानी चाहिए वे बड़ी होती हैं (और उनमें से बहुत सी हो सकती हैं)।
M4N

2

लिनक्स और अन्य यूनिक्स प्रणालियों के तहत, tarकमांड का उपयोग यह आसानी से करेगा।

$ tar cvf /tmp/full-structure.tar *data.zip *info.txt

तब आप लक्ष्य तक पहुँचेंगे और:

$ tar xvf /tmp/full-structure.tar 

बेशक आप पहले टार से 2 में आउटपुट को पाइप कर सकते हैं, लेकिन इसे चरणों में काम करना समझने और समझाने में आसान है। मैं निम्नलिखित कमांड में आवश्यक सीडी / / / नई / पथ / को याद कर रहा हूं - मुझे अभी यह याद नहीं है कि यह कैसे करना है। कोई और इसे जोड़ सकता है, उम्मीद है।

$ tar cvf -  *data.zip *info.txt |  tar xvf - 

टार (गुटरार) विंडोज पर भी उपलब्ध है, लेकिन मैं शायद xcopyउस प्लेटफॉर्म पर स्वयं विधि का उपयोग करूंगा।


tar cvf /tmp/full-structure.tar ** / data.zip ** / info.txt ने मेरे लिए काम किया
ssinganamalla

दोनों "टार cvf /tmp/full-structure.tar ** / data.zip ** / info.txt" और "tar cvf /tmp/full-structure.tar * data.zip * info.txt" ने मुझे कई त्रुटियाँ दीं : (1) "टार: * data.zip: क़ानून नहीं: ऐसी कोई फ़ाइल या निर्देशिका नहीं", (2) "टार * info.txt: नहीं कर सकता क़ानून: ऐसी कोई फ़ाइल या निर्देशिका नहीं", (3) "टार: के साथ बाहर निकलना पिछली त्रुटियों के कारण विफलता की स्थिति "। Whcih फ़ोल्डर से मैं यह सब करते हैं? मुझे यह तरीका समझ नहीं आ रहा है।
user1271772

सवाल विन्डोज़ कहता है
एनफिलिप

Win10 में WSL है, जो इसे वैध बनाता है। टार विंडोज पर 20+ साल के लिए उपलब्ध है और एक पाइप का उपयोग एमएस-डॉस दिनों से काम कर रहा है। किसी भी शेल वातावरण में, PWD महत्वपूर्ण है। पीडब्ल्यूडी - वर्तमान कार्यशील निर्देशिका। मैं मानता हूं कि यह समाधान एंड यूजर्स के लिए कम और पावर-यूजर्स या प्रोग्रामर्स के लिए ज्यादा है।
जॉन्स

1
XCOPY /S folder1\data.zip copy_of_folder1  
XCOPY /S folder1\info.txt copy_of_folder1

EDIT: यदि आप खाली फोल्डर को संरक्षित करना चाहते हैं (जो कि आपके पोस्ट को री-लेयर करने पर आपको लगता है) / S के बजाय / E का उपयोग करते हैं।


1
यह फ़ोल्डर संरचना को संरक्षित नहीं करता है।
पॉलियस

/ ई विकल्प फ़ोल्डर संरचना को संरक्षित करता है, यदि आवश्यक हो तो खाली फ़ोल्डर बनाने सहित। फ़ाइल नाम भी वाइल्डकार्ड के साथ काम करता है (उदाहरण के लिए folder1 \ *। ज़िप)। मैं केवल "फ़ाइल नहीं मिली त्रुटि" प्राप्त करता हूं जब मैं इसे एक पूर्ण फ़ाइल नाम देता हूं जो मौजूद नहीं है (जिस स्थिति में मुझे "फ़ाइल नहीं मिली - xxx.xxx 0 फ़ाइल (ओं) की प्रतिलिपि बनाई गई")। जब मैं इसे एक पैटर्न देता हूं। वह फ़ाइल नहीं लौटाता है (जैसे फ़ोल्डर 1 \ *। ज़ज़), मुझे बस "0 फ़ाइल (* s) कॉपी की गई है"
gkrogers

1

WinRAR कमांड लाइन इंटरफ़ेस का उपयोग करके, आप फ़ाइल नामों और / या फ़ाइल प्रकारों को एक संग्रह में कॉपी कर सकते हैं। फिर आप उस आर्काइव को अपनी पसंद के स्थान पर हटा सकते हैं। यह मूल फ़ाइल संरचना को संरक्षित करता है।

मुझे अपने मोबाइल फोन पर खुद को याद करने के लिए गायब एल्बम चित्र फ़ाइलों को संगीत में जोड़ने की आवश्यकता थी। सौभाग्य से मेरे कंप्यूटर और मोबाइल पर निर्देशिका संरचना समान थी!

मैंनें इस्तेमाल किया:

   rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
  • C: \ download \ music.rar = पुरालेख बनाया जाना है
  • X: \ music \ = फ़ोल्डर जिसमें संगीत फ़ाइलें हों
  • Folder.jpg = फ़ाइल नाम मैं कॉपी करना चाहता था

इसने उचित उपनिर्देशिकाओं में सभी Folder.jpg फाइलों के साथ एक संग्रह बनाया।

इस तकनीक का उपयोग फ़ाइल प्रकारों को कॉपी करने के लिए भी किया जा सकता है। यदि सभी फाइलों के अलग-अलग नाम थे, तो आप सभी फाइलों को एक निर्देशिका में निकालने के लिए चुन सकते हैं। अतिरिक्त कमांड लाइन पैरामीटर कई फ़ाइल प्रकारों को संग्रहीत कर सकते हैं।

इस बहुत उपयोगी लिंक में अधिक जानकारी http://cects.com/using-the-winrar-command-line-tools-in-day/


1

Altap Salamander (2 पैनल फाइल मैनेजर) का उपयोग करने वालों के लिए : कॉपी पॉपअप के विकल्प में, फ़ाइल नाम या मास्क निर्दिष्ट करें। आसान।


0

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

  1. पाठ फ़ाइल में यदि nec, ड्राइव अक्षर सहित संपूर्ण पथ के साथ स्रोत फ़ाइलों की अपनी सूची बनाएँ।
  2. अपने पाठ संपादक में नियमित अभिव्यक्तियों पर स्विच करें।
  3. रिक्त स्थान के मामले में प्रत्येक पंक्ति में दोहरे उद्धरण जोड़ें - स्ट्रिंग को (.*)बदलें स्ट्रिंग"\1" , और सभी को बदलें पर क्लिक करें
  4. प्रति फ़ाइल दो लाइनें बनाएँ - एक निर्देशिका बनाने के लिए, एक फ़ाइल को कॉपी करने के लिए (क़ाक़ को गंतव्य पथ से बदल दिया जाएगा) - खोज स्ट्रिंग स्ट्रिंग (.*)बदलें md qqq\1\nxcopy \1 qqq\1\nऔर सभी को बदलें पर क्लिक करें
  5. गंतव्य पथ से फ़ाइल नाम निकालें - खोज \\([^\\^"]+)"\nबदलें\\"\n
  6. गंतव्य पथ (इस उदाहरण में A:\srcऔर B:\dest) में बदलें । नियमित अभिव्यक्ति बंद करें, qqq"A:\src\बदलें को खोजें B:\dest\और सभी को बदलें पर क्लिक करें।

md नेस्टेड डायरेक्टरी बनाएगा। इस उदाहरण में प्रतिलिपि संभवतः xcopy के लिए व्यवहारिक रूप से व्यवहार करेगी। आप अधिलेखित पुष्टियों को दबाने के लिए / वाई xcopy में जोड़ना चाह सकते हैं। आप एक बैच फ़ाइल के साथ समाप्त करते हैं:

md "B:\dest\a\b\c\"
xcopy "C:\src\a\b\c\e.xyz" "B:\dest\a\b\c\e.xyz"

आपकी मूल सूची में हर फ़ाइल के लिए दोहराया गया। Win7 पर परीक्षण किया गया।


-1

ड्रैग एंड ड्रॉप यूसेज वेजिप के साथ ऐसा करने के लिए एक डीर स्ट्रक्चर प्रोटेक्ट ऑप्शन है। बस डायरेक्टरी लेवल पर एक नया .zip बनाएं जो कि आपका रूट होगा और फाइलों को अंदर खींचें।


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