Robocopy исключает каталоги с подстановочными знаками
Я пытаюсь делать резервные копии критически важных папок и их содержимого на ежедневной основе, чтобы в случае сбоя моего диска с данными у меня была резервная копия важных файлов проекта, но мой рабочий диск с данными намного больше моего резервного диска (19:6), поэтому Я хотел бы ограничить резервное копирование только важными файлами:
RoboCopy %Source% %Dest% *.* /s /xo /purge
работает; /xo
ускорить резервное копирование, пропуская файлы без изменений (это необходимо, так как для резервного копирования 4+ ТБ данных потребуется более одного дня) и /purge
гарантирует, что на резервном диске нет копий файлов, которые мне больше не нужны.
Проблема в том, что есть файлы в папках с именем QA
что я никогда не хочу хранить резервные копии, так что указав /xd QA
следует пропустить эти файлы... но имена не совпадают, иногда это QA, иногда QA_v2 (или 3 или 4), другие примеры включают даты, такие как QA_20160708. Я искал сообщения, подобные этой, которые, кажется, говорят, что можно использовать подстановочный знак, но все комбинации:
RoboCopy %Source% %Dest% *.* /s /xo /purge /xd "*QA*"
RoboCopy %Source% %Dest% *.* /s /xo /purge /xd *QA*
RoboCopy %Source% %Dest% *.* /s /xo /purge /xf "*QA*"
RoboCopy %Source% %Dest% *.* /s /xo /purge /xf *QA*
RoboCopy %Source% %Dest% *.* /s /xo /purge /xd QA
RoboCopy %Source% %Dest% *.* /s /xo /purge /xf QA
все еще скопируйте папку с именем QA_v2 в %Source%
,
Есть ли надежный способ пропустить папки и подпапки папок, которые содержат строку с подстановочными знаками? Может быть важно (или нет), что я использую командный файл в качестве запланированной задачи.
Я мог бы сделать это с помощью скрипта Python, используя os.walk
но shutil.copyfile
действительно медленно по сравнению с RoboCopy
так что это было бы абсолютным последним средством.
3 ответа
Извините, но в соответствии с документацией на https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy:
/ xf
[...] Исключает файлы, которые соответствуют указанным именам или путям. Обратите внимание, что FileName может содержать символы подстановки (* и?).
/ xd[...] Исключает каталоги, которые соответствуют указанным именам и путям.
Так что это, в частности, означает, что подстановочный знак может использоваться во флаге / xf, но не во флаге / xd.
Вы можете просмотреть следующие ссылки и попробовать, возможно, это поможет вам, поскольку ПЕТЕР предложил, чтобы /xd не принимал подстановочные знаки согласно документации, это звучит так, но я думаю, что нет ничего невозможного, у каждой проблемы есть решение.
Вы можете попробовать это в режиме графического интерфейса, если графический интерфейс robocopy или любая новая версия robocopy или альтернативная команда или инструмент инструмента RICH COPY. Я постараюсь найти его для вас подробнее
https://docs.microsoft.com/en-us/previous-versions/technet-magazine/dd547088%28v%3dmsdn.10%29
Тем временем вы видите следующие обсуждения и полезные ссылки для robocopy и пробуете некоторые из них, если они вам подходят.
https://serverfault.com/questions/304896/wildcard-directory-exclusions-with-robocopy-weird-case
https://www.winvistips.com/threads/robocopy-xd-switch-with-wildcards.757807/
https://stackoverflow.com/questions/53087761/robocopy-xd-ignores-a-list-of-directories
Использование robocopy и исключение нескольких каталогов
https://community.spiceworks.com/topic/514474-robocopy-xd-from-text-file
надеюсь, что какие-либо ссылки на инструменты для ссылок подойдут вам, если какие-либо из них сработали, сообщите мне в комментариях, какой из них сработал для вас, если вы не можете задавать дополнительные вопросы, и если сработало, не забудьте проголосовать за ответ и принять ответ
Как и в комментарии выше, я написал скрипт на Python. Но вместо того, чтобы изобретать велосипед (даже если я не сомневаюсь, что результат тоже очень хороший), он просто генерирует файл .bat с командами robocopy.
Очень просто и использует возможности robocopy.
Вот скрипт (настолько короткий, что ему не нужны классы, но я обычно использую эту структуру для более сложных сценариев). Примером здесь является сохранение исходных кодов без всего кода поставщика или истории .git (просто пример). Я могу сгенерировать несколько команд, добавив dict "dirs" в раздел Prm.
import os
class Prm:
out_file = "Robocop.bat"
exclude_defaults = ['.git', 'vendor', 'cache', 'node_modules', 'var', '.idea']
dirs = [
{'src': 'G:\\Develop', 'dest': 'F:\\G_2021-08\\Develop', 'exclude': exclude_defaults}
]
cmd = 'robocopy {} {} /E /R:5 /W:3 /XO /XD {} > {}\n'
class RoboGen:
def gen(self):
with open(Prm.out_file, 'w') as of:
for root_dir in Prm.dirs:
exclude_dirs = []
log_fname = "{}.log".format(root_dir['src'].replace(':','').replace('\\','_'))
for root, dirs, files in os.walk(root_dir['src']):
for xclude in root_dir['exclude']:
if xclude in dirs:
exclude_dirs.append(os.path.join(root, xclude))
dirs.remove(xclude)
#of.write("{}\n".format(root))
cmd = Prm.cmd.format(root_dir['src'], root_dir['dest'], '"{}"'.format('" "'.join(exclude_dirs)), log_fname)
of.write('{}\n'.format(cmd))
if __name__ == "__main__":
RoboGen().gen()