我一直在每晚使用 rsync 将我的 Windows 用户配置文件克隆到远程服务器。我使用--filter='merge <file>'
arg 来加载一个充满包含/排除规则的文件,我用它来避免传输浏览器缓存和其他我知道无用的东西。我还使用 来--prune-empty-dirs
避免创建一堆不必要的空目录。
我的脚本也使用该--delete-excluded
开关,因为这样,如果我识别出更多要排除的内容,我可以将其添加到过滤器文件中,并且下次作业运行时它将自动被删除。
然而,这有删除的副作用全部空目录。我担心,如果应用程序编写得不好,在写入数据之前不检查目录是否存在,这会破坏某些内容。
有没有办法只“修剪”那些因排除而为空的目录,而不是源端实际上为空的目录? (我想用一个简单的规则来做到这一点,而不是由于涉及的目录数量而必须明确地按名称给出任何目录。)
立即想到的唯一解决方法是:
- 停止使用
--prune-empty-dirs
,并接受额外的目录。 - 停止
--delete-excluded
在夜间作业中使用,并在每次更改过滤器文件时手动运行--delete-excluded
(不使用--prune
),这将删除新的排除项并重新创建“真正的”空目录。两者都不理想。
答案1
您可能希望将由于排除而在目标端为空的目录添加到排除过滤器中。如果您可以排除整个目录,那么您的过滤规则将更加简单,--prune-empty-dirs
甚至可能没有必要。或者,您可以将保护规则添加到源端真正为空的目录的过滤器列表中。从 rsync 手册页:
您可以使用全局“保护”过滤器来防止从文件列表中删除某些空目录。例如,此选项将确保目录“emptydir”保留在文件列表中:
--filter '保护空目录/'
Protect 的简称只是大写P
,因此规则可能看起来像
P .stfolder
以保护同步.stfolder
不被修剪。
除非您想要排除或保护的文件夹可以使用某种模式来识别,否则您将需要相当明确地使用您的规则,但这两种方法的某种组合应该能够实现您想要的效果。根据我的经验,rsync 规则永远不会完全完成,而是随着岁月的流逝而逐渐完善。