كيفية نسخ بنية الدليل ولكن تشمل فقط بعض الملفات (باستخدام ويندوز الملفات الدفعية)
-
19-08-2019 - |
سؤال
كما يقول العنوان, كيف يمكنني متكرر نسخ بنية الدليل ولكن تشمل فقط بعض الملفات.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.يبدو شاقة ولكن أسرع بالنسبة لي من العمل بها كيكر.
- إنشاء قائمة خاصة بك من ملفات المصدر مع استكمال المسارات ، بما في ذلك حرف محرك الأقراص إذا nec في ملف نصي.
- التبديل على التعبيرات العادية في محرر النص الخاص بك.
- إضافة علامات الاقتباس المزدوجة جولة كل سطر في حالة المساحات - سلسلة البحث
(.*)
استبدال سلسلة"\1"
, ثم انقر فوق استبدال جميع - إنشاء اثنين من الخطوط في ملف واحد لإنشاء دليل واحد على نسخ الملف (qqq سيتم استبدال مع مسار الوجهة) - سلسلة البحث
(.*)
استبدال سلسلةmd qqq\1\nxcopy \1 qqq\1\n
ثم انقر فوق استبدال جميع - إزالة الملف من الوجهة مسارات البحث
\\([^\\^"]+)"\n
محل\\"\n
- محل في مسار الوجهة (في هذا المثال
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: