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