كيفية نسخ بنية الدليل ولكن تشمل فقط بعض الملفات (باستخدام ويندوز الملفات الدفعية)

StackOverflow https://stackoverflow.com/questions/472692

سؤال

كما يقول العنوان, كيف يمكنني متكرر نسخ بنية الدليل ولكن تشمل فقط بعض الملفات.E. g بالنظر إلى بنية الدليل التالي:

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
هل كانت مفيدة؟

المحلول

لا أذكر إن كان يجب أن يكون دفعة واحدة فقط ، ولكن إذا كان يمكنك استخدام ROBOCOPY, حاول هذا:

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

تحرير:تغيرت /S المعلمة /E تضمين المجلدات الفارغة.

نصائح أخرى

حل بديل نسخ ملف واحد في وقت واحد و لا يتطلب كيكر:

@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.

محاولة الأنابيب الناتج من العثور على (ie.مسار الملف) إلى cpio

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

cpio الشيكات الزمني على الهدف الملفات -- لذلك آمنة وسريعة.

إزالة -v لسرعة العملية مرة كنت تعتاد على ذلك.

إذا Powershell هو الخيار ، يمكنك القيام بذلك:

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

العيب الرئيسي هو نسخ كافة المجلدات ، حتى إذا كانوا في نهاية المطاف يجري فارغة لأنه لا يوجد ملفات تطابق عامل التصفية الذي تحدده.بحيث يمكن في نهاية المطاف مع شجرة كاملة من المجلدات الفارغة ، بالإضافة إلى عدد قليل من المجلدات التي تحتوي على الملفات التي تريد.

شكرا على الأجوبة السابقة.:)

هذا البرنامج النصي المسمى "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

فإنه يقبل متغير من "مصدر" ، "المقصد" و "اسم الملف".كما يمكن فقط نسخ نوع محدد من الملفات أو انتقائية أسماء الملفات.

أي تحسن هي موضع ترحيب.:)

مع البحث و 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 ";"

على غرار Paulius' الحل ، ولكن الملفات لا يهتمون لا يتم نسخ ثم حذف:

@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

أن اثنين فقط من أوامر بسيطة, ولكن أنا لا أوصي هذا إلا الملفات التي لا تحتاج إلى نسخ صغيرة.ذلك لأن هذا سوف نسخ جميع الملفات ثم قم بإزالة الملفات غير اللازمة في نسخة.

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+ دفعة لديه ما يكفي من الأوامر لهذا).

تحت لينكس وغيرها من أنظمة UNIX باستخدام tar سيكون الأمر القيام بذلك بسهولة.

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

ثم كنت cwd إلى الهدف:

$ tar xvf /tmp/full-structure.tar 

وبطبيعة الحال يمكن أن الأنابيب الإخراج من أول القطران في 2nd, ولكن رؤية هذا العمل في الخطوات أسهل لفهم و تفسير.أنا في عداد المفقودين اللازمة cd /إلى/جديد/الطريق/ في الأمر التالي - أنا لا أذكر كيف نفعل ذلك الآن.شخص آخر يمكن إضافته أمل.

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

القطران (gnutar) متاح على ويندوز أيضا ، ولكن كان من المحتمل استخدام xcopy طريقة نفسي على هذا المنبر.

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

تحرير: إذا كنت ترغب في الحفاظ على المجلدات الفارغة (التي ، على إعادة قراءة البريد الخاص بك يبدو أنك) استخدام /E بدلا من /S.

باستخدام برنامج WinRAR واجهة سطر الأوامر, يمكنك نسخ الملف أسماء و/أو أنواع الملفات إلى الأرشيف.ثم يمكنك استخراج الأرشيف إلى أي مكان تريد.هذا يحافظ على الملف الأصلي هيكل.

أنا في حاجة لإضافة عداد المفقودين الألبوم ملفات الصور إلى الهاتف المحمول دون الحاجة إلى إعادة نسخ الموسيقى نفسها.لحسن الحظ بنية الدليل وكان نفس على جهاز الكمبيوتر المحمول!

كنت:

   rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
  • C:\Downloads\music.rar = أرشيف إنشاء
  • X:\music\ = المجلد الذي يحتوي على ملفات الموسيقى
  • Folder.jpg = اسم الملف أردت نسخ

هذا إنشاء أرشيف مع جميع Folder.jpg الملفات في السليم الدلائل.

هذه التقنية يمكن استخدامها لنسخ أنواع الملفات كذلك.إذا كانت الملفات كلها أسماء مختلفة ، يمكنك اختيار لاستخراج كافة الملفات إلى دليل واحد.إضافية معلمات سطر الأوامر يمكن أرشيف أنواع متعددة من الملفات.

مزيد من المعلومات في هذه مفيدة جدا الرابط http://cects.com/using-the-winrar-command-line-tools-in-windows/

لأولئك الذين يستخدمون Altap Salamander (2 لوحات مدير الملفات) :في خيارات نسخ المنبثقة, فقط تحديد أسماء الملفات أو أقنعة.من السهل.

أنا بخير مع التعابير العادية ، كسول و ينفرون إلى تثبيت, لذا قمت بإنشاء ملف دفعي الذي يخلق دليل النسخ مع الفانيليا DOS commands.يبدو شاقة ولكن أسرع بالنسبة لي من العمل بها كيكر.

  1. إنشاء قائمة خاصة بك من ملفات المصدر مع استكمال المسارات ، بما في ذلك حرف محرك الأقراص إذا nec في ملف نصي.
  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 أن xcopy لقمع الكتابة يؤكد.كنت في نهاية المطاف مع ملف دفعي مثل ذلك:

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

تكرار كل ملف في القائمة الأصلية.اختبار على Win7.

للقيام بذلك مع سحب وإسقاط استخدام برنامج لضغط الملفات هناك dir بنية الحفاظ على الخيار.ببساطة إنشاء جديد .الرمز البريدي في مستوى الدليل الذي سوف يكون الجذر الخاص بك و قم بسحب الملفات في.

لنسخ جميع الملفات النصية إلى G:و الحفاظ على بنية الدليل:

xcopy *.txt /s G:
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top