rsync 忽略锚定排除模式

rsync 忽略锚定排除模式

我执行以下操作:

rsync --recursive --delete --delete-excluded --exclude-from=$HOME/etc/rsync_exclude.txt --relative --safe-links --executability . /path/to/savedir

请注意,源目录是工作目录(指定为.

在工作目录中,我有一个目录./repository和一个文件./Vagrantfile

该文件rsync_exclude.txt包含以下几行

/repository/
/Vagrantfile

我预计这些条目会超过我的repositoryand Vagrantfile,因为

  • 前导斜杠表示名称将锚定在保存时的根目录,即工作目录,并且
  • 尾部斜杠存储库明确指出这是一个目录,而不是文件

但是,这两个条目都会被复制。

我做错了什么?

(这是在 MacOS Sierra 上运行的 rsync 2.6.9(但我认为这在这种情况下并不重要))。

更新:

调试 rsync 时(使用-vv和 --dry-run),我可以清楚地看到所有非锚定规则都被接受(例如,rsync 告诉我由于模式 .git/ 隐藏目录 vp5/.git),但所有锚定规则都不起作用。我还尝试用 ./ 或 $PWD 替换源目录 (.),但这也没有任何效果。

此外,当我删除前导 / (例如,将 /repository/ 变为repository/)时,该目录将被排除。当然,现在该目录将被排除在外任何地方在树中,这在这种特殊情况下不会造成伤害,但通常不是我想要的)。

答案1

以下内容适用于rsync3.1.2 版本:

$ ls -F
archive/  backup/  mk-archive.sh*  mk-backup.sh*  mk-cloud.sh*  mk-source.sh*  source/

$ cat /tmp/excludes
/archive/
/backup/
/mk-archive.sh
/mk-backup.sh

$ mkdir -p /tmp/target
$ rsync --relative --recursive --delete --delete-excluded --exclude-from=/tmp/excludes . /tmp/target/

$ ls -F /tmp/target
mk-cloud.sh*  mk-source.sh*  source/

这里发生的情况如 的手册页中所述rsync,因此您的模式必须立即锚定/在副本的开头(即在 下.)。

锚定包含/排除模式
如前所述,全局包含/排除模式锚定在“传输的根”[...]。

因为匹配是相对于传输根目录的,所以更改源路径上的尾部斜杠或更改选项的使用--relative会影响您在匹配中需要使用的路径(除了更改文件树的重复数量之外)目标主机)。 [...]

例子:

cd /home; rsync -a --relative me/foo you/ /dest

+/- 模式:(/me/foo/bar 从指定路径开始)
+/- 模式:(/you/bar/baz 同上)

目标文件:/dest/me/foo/bar
目标文件:/dest/you/bar/baz

-vv您可以通过在命令中添加(或--verbose --verbose) 来查看正在执行的排除项rsync

相关内容