rsync只是目录的特定子集


4

我需要使用rsync来同步rsync服务器中的多个目录。 整个rsync模块非常大,我喜欢避免应对其他,而不是必需的部分。

我将所需目录作为文本文件,但在创建正确的过滤规则文件时遇到问题。我的要求如下:

  • 仅在我的列表中包含目录中的所有文件和子目录。
  • 如果在服务器上删除了包含目录中的文件,则应将其删除。
  • 然而全部 .hg 目录(Mercurial存储库)位于我的网站上但不在服务器上,并且不应删除其中的所有文件和子目录。
  • 不应删除已排除的目录。

到目前为止,我创建了一个看起来像这样的过滤器文件

include sub/dir/I/want/***
include other/sub/dir/I/want/***
...
protect .hg/***
exclude **

但这显然排除了一切。没有 exclude 行所有其他文件也包括在内。

Answers:


2

我发现了这个问题。我的麻烦是由路引起的 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


0

运行rsync两次。

rsync hostname::sub/dir/I/want/        ./sub/dir/I/want/
rsync hostname::other/sub/dir/I/want/  ./other/sub/dir/I/want/

1
我有超过2000个子目录,所以这不是一个选择。
Martin Scharrer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.