rsync 忽略以斜杠结尾的文件夹

Rsync ignores folders ending in slashes

我在名为“/rsync/include.txt”的文件中有以下内容

+ /home/**
+ /opt**
- *

然后我调用 rsync 命令如下:

rsync -avr --include-from="/rsync/include.txt" . ../backup

这会产生以下输出:

sending incremental file list
created directory ../archive
./
opt/
opt/some-file
opt/include-me/
opt/include-me/me-too
opt/include-me/and-me/

sent 299 bytes  received 106 bytes  810.00 bytes/sec
total size is 0  speedup is 0.00

/home 目录存在,并且包含文件。

为什么 + /home/** 模式不起作用?我不想使用 + /home** 模式,因为它可以匹配其他文件夹名称,例如 /homeopathy

任何人都可以帮助我理解为什么这个命令不起作用,并指出工作命令的方向吗?

编辑:虽然我仍然想回答这个问题,但我真诚地建议使用 rdiff-backup,因为它使用类似的过滤文件和模式,但实质上更容易使用。我今天在 rsync 的这个问题上花了很多时间,使用 rdiff-backup.

在几分钟内解决了这个问题

一般调试信息

查看您的过滤规则是否符合您的要求的最简单方法是结合使用 -vv(增加两倍的冗长程度)和 -n(dry-运行)。

通过双重冗长,您将看到哪个模式导致哪个文件被忽略。 您可能 grep 只看到相关部分的输出。

例子

%  rsync -avv --include 'opt/1' --exclude 'opt/*' -n ./ /tmp  \
    | grep '\[sender\]'
[sender] showing directory opt/1 because of pattern opt/1
[sender] hiding directory opt/2 because of pattern opt/*
[sender] hiding directory opt/3 because of pattern opt/*

具体答案

您的示例失败,因为 + /home/**- * 排除。

man rsync 状态:

Note that, when using the --recursive (-r) option (which is implied by -a), every subdir component of every path is visited left to right, with each directory having a chance for exclusion before its content.

所以模式/home/**会在遍历/home之后进行求值,但这种情况永远不会发生,因为- *排除了/home.

要包含 /home/,您只需将其插入到 /home/** 之前,这样您的排除文件就会变成:

+ /home/
+ /home/**
+ /opt/
+ /opt/**
- *