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/cc160891(v=msdn.10)?redirectedfrom=MSDN

https://docs.microsoft.com/en-us/previous-versions/technet-magazine/dd547088%28v%3dmsdn.10%29

https://www.gurusquad.com/GSRICHCOPY360?gclid=EAIaIQobChMI-srAw8yW6AIVlhePCh2JiwFNEAAYASAAEgJUh_D_BwE

Тем временем вы видите следующие обсуждения и полезные ссылки для robocopy и пробуете некоторые из них, если они вам подходят.

https://stackoverflow.com/questions/14511537/how-to-exclude-subdirectories-in-the-destination-while-using-mir-xd-switch-in

https://serverfault.com/questions/304896/wildcard-directory-exclusions-with-robocopy-weird-case

https://social.technet.microsoft.com/Forums/windows/en-US/3c20df97-b0a3-440b-9170-97d80a54145f/robocopy-wildcard-xd?forum=w7itprogeneral

https://www.winvistips.com/threads/robocopy-xd-switch-with-wildcards.757807/

https://stackoverflow.com/questions/53087761/robocopy-xd-ignores-a-list-of-directories

https://social.technet.microsoft.com/Forums/ie/en-US/1094222a-ddfa-4357-9472-218816a2307c/robocopy-version-xp010-exclude-multiple-directories-using-xd?forum=winserverfiles

Использование 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()
Другие вопросы по тегам