rsync --delete-excluded 和 --prune-empty-dirs,但只修剪排除的目录

mee*_*tch 6 rsync

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

我的脚本也使用了--delete-excluded开关,因为这样如果我确定了更多要排除的内容,我只需将其添加到过滤器文件中,它就会在下次作业运行时自动取消。

但是,这具有删除所有空目录的副作用。我担心这会在编写糟糕的应用程序的情况下破坏某些内容,该应用程序在写入数据之前不检查目录是否存在。

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

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

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

小智 3

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

\n\n
\n

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

\n\n

--filter \xe2\x80\x99protect 空目录/\xe2\x80\x99

\n
\n\n

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

\n\n

P .stfolder

\n\n

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

\n\n

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

\n