rsync排除目录但包含子目录

时间:2011-11-25 14:30:37

标签: shell include rsync

我正在尝试使用rsync将项目复制到我的服务器。 我在子目录

中有项目特定的安装脚本

项目/功能/安装/ PROJECT1

我要做的是排除 project / specs 目录中的所有内容,但是项目特定的安装目录: project / specs / install / project1

rsync -avz --delete --include=specs/install/project1 \
    --exclude=specs/* /srv/http/projects/project/ \
     user@server.com:~/projects/project

但是像这样,specs目录的内容被排除,但是不包含install / project1目录。

我已经尝试了一切,但我似乎似乎没有让这个工作

3 个答案:

答案 0 :(得分:33)

有时它只是一个细节。

只需更改包含模式,在包含模式的末尾添加一个尾随/它就可以了:

rsync -avz --delete --include=specs/install/project1/ \
    --exclude=specs/* /srv/http/projects/project/ \
    user@server.com:~/projects/project

或者,或者,替代方案,准备一个这样的过滤器文件:

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

然后使用--filter选项:

rsync -avz --delete --filter=". pattern.txt" \
    /srv/http/projects/project/ \
    user@server.com:~/projects/project

有关详细信息,请转到rsync(1)手册页中的FILTER RULES部分。

答案 1 :(得分: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/ \
    user@server.com:~/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/ \
    user@server.com:~/projects/project

请注意添加的选项-m。

答案 2 :(得分:0)

--include--exclude的顺序会影响所包含或排除的内容。
当要包含特定的子目录时,需要将它们放在第一位。
类似的帖子here