2011-11-25 107 views
19

我想用rsync将项目复制到我的服务器。 我有项目的具体子目录中的安装脚本rsync排除一个目录,但包括一个子目录

项目/规格/安装/ PROJECT1

我所要做的是排除一切都在项目/规格目录,但具体安装目录中的项目:项目/规格/安装/项目1

rsync -avz --delete --include=specs/install/project1 \ 
    --exclude=specs/* /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

但这样的规格目录的内容被排除,但是在安装/ PROJECT1目录不包括得到。

我已经试过一切,但我只是似乎没有得到这个工作

+1

刚刚在linuxquestions.org上找到了一个类似的问题,可能有所帮助:http://www.linuxquestions.org/questions/linux-software-2/rsync-include-exclude-problems-636504/ – Chris

+0

谢谢,解决了它!有时Rsync确实有一个奇怪的逻辑。 – user1036651

+0

Duplicates http://stackoverflow.com/questions/7960669/with-rsync-how-do-includes-and-excludes-combine/7961687#7961687 –

回答

29

有时它只是一个细节。

只要改变你的方式包括增加一个尾随/在年底包括模式,它会工作:

rsync -avz --delete --include=specs/install/project1/ \ 
    --exclude=specs/* /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

或者,在替代方案,制作了过滤器文件是这样的:

$ cat <<EOF>pattern.txt 
> + specs/install/project1/ 
> - specs/* 
> EOF 

然后使用--filter选项:

rsync -avz --delete --filter=". pattern.txt" \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

如需进一步信息请访问的过滤规则部分rsync(1)手册页。

+2

过滤规则确实是处理比“排除所有.git目录”更复杂的任何事情的唯一理智方式。 –

8

另一种解决方案在这里不起作用。


可靠的方式

你别无选择,只能手动下降为您的子目录,每个级别。包含不需要的文件没有风险,因为rsync不包括包含目录的文件。

1)创建一个包含过滤器文件,例如 “include_filter.txt”:

+ /specs/ 
+ /specs/install/ 
+ /specs/install/project1/*** 
- /specs/** 

2)运行它:

rsync -avz --delete --include-from=include_filter.txt \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 
  • 不要忘了启动斜杠“/ “,否则你可能会匹配名为”**/specs/install/project1 /“的子目录。
  • 通过选择包含类型过滤器(--include-from = FILE),启动加“+”符号实际上是可选的,因为这是没有符号的默认操作。 (默认情况下,您可以使用--exclude-from = FILE来设置相反的“ - ”。)
  • 的双星 “**” 是指 “任何路径”
  • 的三连星 “***” 是指 “任何路径,包括这个非常目录”

简单的方法

你可以开始你的过滤器“* /”,允许rsync下降你所有的子级别。这很方便,但是:

  • 所有目录都将被包括在内,尽管为空。这可以通过rysnc选项-m修复,但是所有空的目录都会被跳过。

1)创建一个包含过滤器文件,例如 “include_filter.txt”:

+ /**/ 
+ /specs/install/project1/*** 
- /specs/** 

2)运行它:

rsync -avzm --delete --include-from=include_filter.txt \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

注意添加的选项-m。

相关问题