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

时间:2021-03-29 02:13:27

标签: rsync

我正在尝试使用 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?排除也一样?

1 个答案:

答案 0 :(得分:0)

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