rsync --delete-excluded 与 --prune-empty-dirs 一起使用,但仅修剪排除的目录

rsync --delete-excluded 与 --prune-empty-dirs 一起使用,但仅修剪排除的目录

我一直在每晚使用 rsync 将我的 Windows 用户配置文件克隆到远程服务器。我使用--filter='merge <file>'arg 来加载一个充满包含/排除规则的文件,我用它来避免传输浏览器缓存和其他我知道无用的东西。我还使用 来--prune-empty-dirs避免创建一堆不必要的空目录。

我的脚本也使用该--delete-excluded开关,因为这样,如果我识别出更多要排除的内容,我可以将其添加到过滤器文件中,并且下次作业运行时它将自动被删除。

然而,这有删除的副作用全部空目录。我担心,如果应用程序编写得不好,在写入数据之前不检查目录是否存在,这会破坏某些内容。

有没有办法只“修剪”那些因排除而为空的目录,而不是源端实际上为空的目录? (我想用一个简单的规则来做到这一点,而不是由于涉及的目录数量而必须明确地按名称给出任何目录。)

立即想到的唯一解决方法是:

  1. 停止使用--prune-empty-dirs,并接受额外的目录。
  2. 停止--delete-excluded在夜间作业中使用,并在每次更改过滤器文件时手动运行--delete-excluded(不使用--prune),这将删除新的排除项并重新创建“真正的”空目录。两者都不理想。

答案1

您可能希望将由于排除而在目标端为空的目录添加到排除过滤器中。如果您可以排除整个目录,那么您的过滤规则将更加简单,--prune-empty-dirs甚至可能没有必要。或者,您可以将保护规则添加到源端真正为空的目录的过滤器列表中。从 rsync 手册页:

您可以使用全局“保护”过滤器来防止从文件列表中删除某些空目录。例如,此选项将确保目录“emptydir”保留在文件列表中:

--filter '保护空目录/'

Protect 的简称只是大写P,因此规则可能看起来像

P .stfolder

以保护同步.stfolder不被修剪。

除非您想要排除或保护的文件夹可以使用某种模式来识别,否则您将需要相当明确地使用您的规则,但这两种方法的某种组合应该能够实现您想要的效果。根据我的经验,rsync 规则永远不会完全完成,而是随着岁月的流逝而逐渐完善。

相关内容