我执行以下操作:
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
我预计这些条目会超过我的repository
and Vagrantfile
,因为
- 前导斜杠表示名称将锚定在保存时的根目录,即工作目录,并且
- 尾部斜杠存储库明确指出这是一个目录,而不是文件
但是,这两个条目都会被复制。
我做错了什么?
(这是在 MacOS Sierra 上运行的 rsync 2.6.9(但我认为这在这种情况下并不重要))。
更新:
调试 rsync 时(使用-vv
和 --dry-run),我可以清楚地看到所有非锚定规则都被接受(例如,rsync 告诉我由于模式 .git/ 隐藏目录 vp5/.git),但所有锚定规则都不起作用。我还尝试用 ./ 或 $PWD 替换源目录 (.),但这也没有任何效果。
此外,当我删除前导 / (例如,将 /repository/ 变为repository/)时,该目录将被排除。当然,现在该目录将被排除在外任何地方在树中,这在这种特殊情况下不会造成伤害,但通常不是我想要的)。
答案1
以下内容适用于rsync
3.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
。