rsync 仅同步目录的特定子集

rsync 仅同步目录的特定子集

我需要使用 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/

相关内容