“cp --parents” в пакетном файле / VBScript
-
10-07-2019 - |
Вопрос
Как бы вы написали это, имея в вашем распоряжении только пакетные файлы и VBScript в среде Windows?
find -name '*.ext' -exec cp --parents {} destination/ \;
Или , скажем так,:
- Рекурсивно найдите в текущей папке некоторый шаблон имени файла (заканчивающийся расширением, называемым
ext
в приведенном выше примере), - Скопируйте каждый из этих файлов в папку назначения (где бы она ни находилась), сохранив древовидную структуру каталогов (или создав все отсутствующие промежуточные каталоги), как в текущей папке.
Решение
Это должно сработать:
for /r %%a in (*.cmd) do xcopy %%a C:\DESTINATION%%~pa
Обратите внимание , что DESTINATION
следует никогда быть подкаталогом каталога, из которого вы пытаетесь скопировать, в противном случае for /r
переходит в рекурсивный цикл копирования файлов, которые он уже скопировал, создавая все более и более длинные пути к каталогам (не спрашивайте меня, откуда я знаю).
Вы могли бы сделать его немного более надежным, используя xcopy /c
(чтобы продолжить копирование, даже если возникнут ошибки).Возможно, вы также захотите взглянуть на xcopy /?
чтобы посмотреть, есть ли там еще что-нибудь ценное (/q
, /r
, /o
, и т.д.).
Другие советы
Редактировать: Виноват, я пропустил флаг --parents в команде cp...xcopy, как показано ниже, будет воссоздан только нисходящий путь, а не путь к каталогам "выше" текущего каталога.
Я [сейчас] верить xcopy ( копия ) бы [не] сделай свое дело [в одиночку.Но творит чудеса с трюком Гранта Вагнера "for /r"].
xcopy [some_path]*.ext [some_otherpath]\final_directory /E
(or /S, above, if you don't want empty directories)
the elements within brackets, some_path and some_otherpath are optional