rsync排除一个目录,但包括一个子目录
问题描述:
我想用rsync将项目复制到我的服务器。 我有项目的具体子目录中的安装脚本rsync排除一个目录,但包括一个子目录
项目/规格/安装/ PROJECT1
我所要做的是排除一切都在项目/规格目录,但具体安装目录中的项目:项目/规格/安装/项目1。
rsync -avz --delete --include=specs/install/project1 \
--exclude=specs/* /srv/http/projects/project/ \
[email protected]:~/projects/project
但这样的规格目录的内容被排除,但是在安装/ PROJECT1目录不包括得到。
我已经试过一切,但我只是似乎没有得到这个工作
答
有时它只是一个细节。
只要改变你的方式包括增加一个尾随/在年底包括模式,它会工作:
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目录”更复杂的任何事情的唯一理智方式。 –
答
另一种解决方案在这里不起作用。
可靠的方式
你别无选择,只能手动下降为您的子目录,每个级别。包含不需要的文件没有风险,因为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。
刚刚在linuxquestions.org上找到了一个类似的问题,可能有所帮助:http://www.linuxquestions.org/questions/linux-software-2/rsync-include-exclude-problems-636504/ – Chris
谢谢,解决了它!有时Rsync确实有一个奇怪的逻辑。 – user1036651
Duplicates http://*.com/questions/7960669/with-rsync-how-do-includes-and-excludes-combine/7961687#7961687 –