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部分.
另一种解决方案不适用于此.
可靠的方式
您别无选择,只能为子目录的每个级别手动下降.包含不需要的文件没有风险,因为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)
简单的方法
您可以启动过滤器"*/",允许rsync下降所有子级别.这很方便但是:
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.