2009-01-23 59 views
75

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

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 

उत्तर

124

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

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

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

+0

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

+0

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

+1

रॉबोकॉपी सी: \ स्रोत सी: \ गंतव्य * .zip/E –

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

संपादित करें: आप खाली फ़ोल्डर (जो, अपने पद फिर से पढाना पर, आप करने लगते हैं) का उपयोग// एस के बजाय ई की रक्षा करना चाहते हैं।

+0

यह एक त्रुटि देता है: "फ़ाइल नहीं मिली - data.zip"। – M4N

+1

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

+0

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

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+ बैच के लिए पर्याप्त आदेश हैं)।

+0

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

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 
24

एक वैकल्पिक समाधान है कि एक समय में प्रतियां एक फ़ाइल और 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 में बनाया जाना आवश्यक है।

+0

मुझे फ़ोल्डरों और उपफोल्डर से सभी फ़ोटो कॉपी करने की आवश्यकता है, इस बैच स्क्रिप्ट में मदद मिली। बस लाइन 'सेट FILENAMES_TO_COPY = data.zip info.txt' ऊपर FILENAMES_TO_COPY = * सेट करें। Jpg' –

-1

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

+0

धन्यवाद, लेकिन मैं स्क्रिप्ट (बैच) फ़ाइलों से उपयोग करने के लिए एक समाधान की तलाश में था। इसलिए, कोई ड्रैग और ड्रॉप नहीं ... – M4N

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 

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

कोई भी सुधार स्वागत है। :) सीपीआईओ में खोज (। यानी फ़ाइल पथ) के

12

कोशिश पाइपिंग उत्पादन

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

सीपीआईओ चेकों लक्ष्य फाइलों पर टाइमस्टैम्प - तो उसके सुरक्षित और तेजी से।

एक बार जब आप इसका उपयोग करते हैं, तो तेज़ सेशन के लिए हटाएं -v।

+2

@ क्रिस्टियन सीपीओ पर निर्भरता है जो मानक स्थापित का हिस्सा नहीं है। – Crashworks

2

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

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

तो फिर तुम लक्षित करने के लिए CWD चाहते हैं और:

$ tar xvf /tmp/full-structure.tar 
बेशक आप पाइप 2 में पहले राल से उत्पादन कर सकता है

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

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

राल (gnutar) भी विंडोज पर उपलब्ध है, लेकिन मैं शायद xcopy विधि अपने आप को मंच पर उपयोग करेंगे।

+0

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

+0

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

4
केवल खोजें और सीपी के साथ

:

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 ";" 
1

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

0

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

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

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

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

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

4

Powershell एक विकल्प है, तो आप ऐसा कर सकते हैं:

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

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

1

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

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

मैं प्रयोग किया है:

rar a -r C:\Downloads\music.rar X:\music\Folder.jpg 
  • C: \ डाउनलोड \ music.rar = आर्काइव बनाया जाना
  • एक्स: \ संगीत \ = फ़ोल्डर संगीत फ़ाइलों से युक्त
  • Folder.jpg = फ़ाइल का नाम मैं

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

इस तकनीक का उपयोग फ़ाइल प्रकारों की प्रतिलिपि बनाने के लिए भी किया जा सकता है। अगर फाइलों के सभी अलग-अलग नाम होते हैं, तो आप सभी फ़ाइलों को एक निर्देशिका में निकालने का विकल्प चुन सकते हैं। अतिरिक्त कमांड लाइन पैरामीटर एकाधिक फ़ाइल प्रकारों को संग्रहित कर सकते हैं। यह बहुत ही उपयोगी लिंक http://cects.com/using-the-winrar-command-line-tools-in-windows/

-1

में

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

xcopy *.txt /s G: