我需要使用 rsync 从 rsync 服务器同步多个目录。整个 rsync 模块相当大,而且我也不想处理其他不必要的部分。
我有所需目录的文本文件,但在创建正确的过滤规则文件时遇到问题。我的要求如下:
- 仅包含我的列表中的目录以及其中包含的所有文件和子目录。
- 如果在服务器上删除了包含的目录中的文件,则应删除其中的文件。
.hg
但是,不应删除位于我的站点上但不在服务器上的所有目录(Mercurial 存储库)以及其中的所有文件和子目录。- 不应删除排除的目录。
到目前为止,我创建了一个如下所示的过滤文件
include sub/dir/I/want/***
include other/sub/dir/I/want/***
...
protect .hg/***
exclude **
但这显然排除了所有内容。如果没有此exclude
行,则所有其他文件也包括在内。
答案1
我找到了问题所在。我的问题是由处理文件名的方式引起的rsync
。绝对(即相对于传输根目录)包含路径不能直接工作,因为还必须包含父目录。否则整个目录结构已被排除,所需的文件或子目录永远不会被处理。手册实际上这么说(某处),但这非常违反直觉。
为了仅包含某些子目录,必须包含所有父目录,然后必须再次排除它们的所有其他子目录:
include sub/
include sub/dir/
include sub/dir/I/
include sub/dir/I/want/***
exclude sub/*
exclude sub/dir/*
exclude sub/dir/I/*
include other/
include other/sub/
include other/sub/dir/
include other/sub/dir/I/
include other/sub/dir/I/want/***
exclude other/*
exclude other/sub/*
exclude other/sub/dir/*
exclude other/sub/dir/I/*
...
protect .hg*
exclude /*
倒数第二行保护所有.hg*
目录和文件,如.hg/
和.hgtags
。此行排除传输根目录中的所有其他目录。
我编写了一个 Perl 脚本,从所需子目录列表中生成上述过滤文件。该文件可在以下位置访问:http://www.perlmonks.org/?node_id=928357。
答案2
运行 rsync 两次。
rsync hostname::sub/dir/I/want/ ./sub/dir/I/want/
rsync hostname::other/sub/dir/I/want/ ./other/sub/dir/I/want/