Копирование дерева каталогов и файлов содержимого только определенных папок

284
Squashman

Я пытаюсь заархивировать большое количество файлов только из подпапок с определенным именем. Я также хотел бы сохранить исходную структуру папок, чтобы моя команда имела простой доступ к архивным файлам.

До сих пор я нашел, как сделать это для определенных имен файлов, используя robocopy, но я не могу заставить это работать для определенных папок.

robocopy "c:\folder1[wildcard?]\obsolete" "c:\folder2\" \E 

пример:

c:\folder1\client1\obsolete\ c:\folder1\client1\obsolete\ (files & folders I'd like to copy) c:\folder1\client1\project1\ c:\folder1\client1\file.txt c:\folder1\client2\project1\ c:\folder1\client2\project1\obsolete\ (files & folders I'd like to copy) c:\folder1\client2\project2\ c:\folder1\client3\obsolete\ c:\folder1\client3\obsolete\ (files & folders I'd like to copy) 

результат:

c:\folder2\client1\obsolete\ c:\folder2\client1\obsolete\ (files & folders) c:\folder2\client2\project1\obsolete\ c:\folder2\client2\project1\obsolete\ (files & folders) c:\folder2\client3\obsolete\ c:\folder2\client3\obsolete\ (files & folders) 
0

1 ответ на вопрос

1
FatalBulletHit

Это должно сделать работу:

@ECHO OFF SETLOCAL EnableDelayedExpansion    REM **************************************************  SET source_dir=C:\folder1  SET target_dir=C:\folder2  SET wildcard=obsolete  REM **************************************************    FOR /D /R %%G IN ("%source_dir%") DO ( SET "folder_name=%%G" ECHO !folder_name! | FINDSTR /R "%wildcard%" >nul && CALL :copy )   ECHO. & ECHO. & ECHO. & ECHO. & ECHO. & ECHO Done^^! PAUSE EXIT   :copy  SET target_folder_name=!folder_name:%source_dir%\=!  SET endbit=!target_folder_name:*%wildcard%=! SET target_folder_name=!target_folder_name:%endbit%=!  SET endbit=!folder_name:*%wildcard%=! SET folder_name=!folder_name:%endbit%=!  ROBOCOPY "!folder_name!" "%target_dir%\!target_folder_name!" /E EXIT /B 

Учитывается wildcardрегистр, если вы не добавите /Iопцию в FINDSTR:

ECHO !folder_name! | FINDSTR /I /R "%wildcard%" >nul && CALL :copy