如何在 rsync 中使用包含和排除优先级?

Posted

技术标签:

【中文标题】如何在 rsync 中使用包含和排除优先级?【英文标题】:How to use include and exclude precedence with rsync? 【发布时间】:2021-06-25 02:44:51 【问题描述】:

我正在尝试使用 rsync 备份机器,在阅读了大量 SO QA 和手册页之后,我仍然无法理解包含/排除优先级的工作原理,因此我可以传输正确的文件集。混淆了具体细节,我正在尝试以下操作:

递归包含:

/home/erik/foo
/home/erik/bar
/home/erik/baz

递归地包含/git,但排除一些特定的子目录,例如/git/src/github.com/foo/git/src/github.com/bar

到目前为止,我认为的 rsync 命令应该可以完成此任务。它没有,我尝试了许多以不同方式失败的变体:

rsync -am \
  --include='*/' \
  --include='/home/erik/foo' \
  --include='/home/erik/bar' \
  --include='/home/erik/baz' \
  --include='/git' \
  --exclude='/git/bin' \
  --exclude='/git/src/github.com/foo' \
  --exclude='/git/src/github.com/bar' \
  --exclude='*' \
  / nfs.example.com:/data/pool/backup/laptop

一些具体问题:

我已经多次看到它暗示初始 --include='*/ 是必要的,尽管我不完全确定为什么。我认为这与确保扩展和遵循目录有关(?)。我还假设最终排除是排除任何与更高语句不匹配的文件?有人可以详细说明这两个是否都是必要的,它们的位置是否重要?

我不确定目录是否需要前导/。我已经看到这些路径与/ 的请求传输根相关的提示,这表明它应该类似于home/erik,但我也没有成功。有人可以详细说明这是如何工作的吗?

如果我想包含目录和所有子内容,我不确定路径中是​​否需要后缀 /

有人可以详细说明参数的位置是否真的很重要,即,将应用列表中要匹配的第一个?

有什么理由让我更喜欢--filter='+ X' 而不是--include?排除也一样?

【问题讨论】:

*** 是针对有关编程的问题,而不是一般的命令行工具使用; Unix & Linux stackexchange 或 Superuser 会是更好的地方来询问这个问题(但首先寻找类似的现有问题,看看它们是否有帮助)。此外,您已将/ 作为副本的来源——您真的要复制整个文件系统(有一些例外),还是只是/home/erik?另外,/git 真的在系统卷的顶层(正如开头的 / 所暗示的那样),还是在其他地方? @GordonDavisson 我使用 / 作为副本的源以捕获 /git(它实际上是系统的顶层)和 /home/erik,同时仅过滤我需要的内容.我没有看到将这两者都包含在单个命令中的替代方法,因为它们唯一的共享节点是文件系统的根。 【参考方案1】:

我不确定是否有更本地的方式来交叉发布答案,但我在 Stack Exchange 上询问并得到了this excellent answer that solved what I was trying to do perfectly, with context。

【讨论】:

以上是关于如何在 rsync 中使用包含和排除优先级?的主要内容,如果未能解决你的问题,请参考以下文章

使 rsync 排除所有包含具有特定名称的文件的目录

mysql条件查询and or使用实例及优先级介绍

如何在 C++ 中正确使用优先级队列

vue的keep-alive中,使用include和exclude优先级

rsync文件/文件夹来自输入文件中的列表,并从排除文件中排除

依赖包的优先级设置