rsync排除目录但包含子目录

use*_*651 24 shell rsync include

我试图用rsync将项目复制到我的服务器.我在一个子目录中有项目特定的安装脚本

项目/规格/安装/ PROJECT1

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

rsync -avz --delete --include=specs/install/project1 \
    --exclude=specs/* /srv/http/projects/project/ \
     user@server.com:~/projects/project
Run Code Online (Sandbox Code Playgroud)

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

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

spi*_*der 35

有时它只是一个细节.

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

rsync -avz --delete --include=specs/install/project1/ \
    --exclude=specs/* /srv/http/projects/project/ \
    user@server.com:~/projects/project
Run Code Online (Sandbox Code Playgroud)

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

$ cat << EOF >pattern.txt
> + specs/install/project1/
> - specs/*
> EOF
Run Code Online (Sandbox Code Playgroud)

然后使用--filter选项:

rsync -avz --delete --filter=". pattern.txt" \
    /srv/http/projects/project/ \
    user@server.com:~/projects/project
Run Code Online (Sandbox Code Playgroud)

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

  • 过滤规则确实是处理比"排除所有.git目录"更复杂的任何理智的方式. (2认同)

lod*_*odc 9

另一种解决方案不适用于此.


可靠的方式

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

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

+ /specs/
+ /specs/install/
+ /specs/install/project1/***
- /specs/**
Run Code Online (Sandbox Code Playgroud)

2)运行它:

rsync -avz --delete --include-from=include_filter.txt \
    /srv/http/projects/project/ \
    user@server.com:~/projects/project
Run Code Online (Sandbox Code Playgroud)
  • 不要忘记起始斜杠"/",否则你可以匹配名为"**/specs/install/project1 /"的子目录.
  • 通过选择包含类型过滤器(--include-from = FILE),起始加"+"符号实际上是可选的,因为这是没有符号的默认操作.(默认情况下,您可以使用相反的" - " - --exclude-from = FILE.)
  • 双星"**"的意思是"任何路径"
  • 三星"***"的意思是"任何路径,包括这个目录"

简单的方法

您可以启动过滤器"*/",允许rsync下降所有子级别.这很方便但是:

  • 所有目录都将包含在内,尽管是空的.这可以使用rysnc选项-m修复,但随后将跳过所有空目录.

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

+ /**/
+ /specs/install/project1/***
- /specs/**
Run Code Online (Sandbox Code Playgroud)

2)运行它:

rsync -avzm --delete --include-from=include_filter.txt \
    /srv/http/projects/project/ \
    user@server.com:~/projects/project
Run Code Online (Sandbox Code Playgroud)

请注意添加的选项-m.