我正在尝试使用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目录。
我已经尝试了一切,但我似乎似乎没有让这个工作
答案 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
简单方法
您可以启动过滤器“* /”,允许rsync下降所有子级别。这很方便但是:
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。