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/**
- *
我在名为“/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/**
- *