Robocopy 使用通配符排除目录

Robocopy 使用通配符排除目录

我每天都会尝试备份关键文件夹及其内容,这样,如果我的数据驱动器出现故障,我就可以备份重要的项目文件我的工作数据驱动器比我的备份驱动器(19:6)大得多,所以我想将备份限制为重要文件:

RoboCopy %Source% %Dest% *.* /s /xo /purge

有效;/xo通过跳过未修改的文件来加快备份速度(这是必要的,因为备份 4+ TB 的数据需要一天以上的时间)并/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,所以这绝对是最后的手段。

答案1

很抱歉,但根据https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy

/xf <FileName>[ ...] 排除与指定名称或路径匹配的文件。请注意,FileName 可以包含通配符 (* 和 ?)。/
xd <Directory>[ ...] 排除与指定名称和路径匹配的目录。

所以这具体意味着通配符可以在 /xf 标志中使用,但不能在 /xd 标志中使用。

答案2

您可以查看以下链接并尝试,它可能对您有用,因为 PETER 建议 /xd 不接受通配符,根据文档,听起来是这样,但我认为没有什么是不可能的,每个问题都有解决方案

你可以尝试使用 GUI 模式,如果 robocopy GUI 或任何新版本的 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.winvistatips.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-clusion-multiple-directories-using-xd?forum=winserverfiles

使用 robocopy 并排除多个目录

https://community.spiceworks.com/topic/514474-robocopy-xd-from-text-file

希望任何链接工具参考对你有用,如果有用,请在评论中告诉我哪一个对你有用,如果没有,请随时提出进一步的问题,如果有效,那么不要忘记投票并接受答案

答案3

就像上面的评论一样,我写了一个python脚本。但是它并没有重新发明轮子(即使我也不怀疑结果也很好),而是只生成了一个带有robocopy命令的.bat文件。

非常简单,并且利用了 robocopy 的强大功能

这是脚本(非常短,不需要类,但我通常将此结构用于更复杂的脚本)。这里的示例是保存没有所有供应商代码或 .git 历史记录的源(仅作为示例)我可以通过向 Prm 部分添加“dirs”字典来生成多个命令

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()

相关内容