Rsync会忽略以斜杠结尾的文件夹

时间:2018-06-25 13:06:50

标签: shell rsync

我在名为“ /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在几分钟内解决了这个问题。

1 个答案:

答案 0 :(得分:1)

常规调试信息

查看过滤器规则是否满足您的要求的最简单方法是将-vv(增加两次冗长)与-n(空运行)结合使用。

具有双重详细说明,您将看到哪个模式导致哪个文件被忽略。 您可以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状态:

  

请注意,使用--recursive(-r)选项(由-a表示)时,每个路径的每个subdir组件都是从左到右访问的,每个目录都有在其内容之前被排除的机会。

因此模式/home/**将在遍历/home之后求值,但这不会发生,因为- *排除了/home

要包含/home/,只需将其插入/home/**之前,这样排除文件将变为:

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