我每天都会尝试备份关键文件夹及其内容,这样,如果我的数据驱动器出现故障,我就可以备份重要的项目文件但我的工作数据驱动器比我的备份驱动器(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/dd547088%28v%3dmsdn.10%29
同时,您可以看到以下有关 robocopy 的讨论和建议链接,如果对您有用,请尝试其中的一些
https://serverfault.com/questions/304896/wildcard-directory-exclusions-with-robocopy-weird-case
https://www.winvistatips.com/threads/robocopy-xd-switch-with-wildcards.757807/
https://stackoverflow.com/questions/53087761/robocopy-xd-ignores-a-list-of-directories
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()