Shell rsync排除一个目录,但包含一个子目录

Shell rsync排除一个目录,但包含一个子目录,shell,include,rsync,Shell,Include,Rsync,我正在尝试使用rsync将项目复制到我的服务器。 我在子目录中有特定于项目的安装脚本 项目/规格/安装/项目1 我要做的是排除项目/specs目录中的所有内容,但排除特定于项目的安装目录:项目/specs/install/project1 rsync -avz --delete --include=specs/install/project1 \ --exclude=specs/* /srv/http/projects/project/ \ user@server.com:~/

我正在尝试使用rsync将项目复制到我的服务器。 我在子目录中有特定于项目的安装脚本

项目/规格/安装/项目1

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

rsync -avz --delete --include=specs/install/project1 \
    --exclude=specs/* /srv/http/projects/project/ \
     user@server.com:~/projects/project
但是像这样,specs目录的内容被排除,但是install/project1目录没有被包括在内


我已经尝试了所有的方法,但我似乎无法让它发挥作用,有时这只是一个细节

只需更改您的include模式,在include模式的末尾添加一个尾随/即可:

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

有关更多信息,请转到rsync(1)手册页面中的“筛选规则”部分。

其他解决方案在此不起作用


可靠的方法

您别无选择,只能为子目录的每个级别手动下降。不存在包含不需要的文件的风险,因为rsync不包含包含目录中的文件

1) 创建包含筛选器文件,例如“include_filter.txt”:

2) 运行它:

  • 不要忘记起始斜杠“/”,否则您可能会匹配名为“**/specs/install/project1/”的子目录
  • 通过选择包含类型筛选器(--include from=FILE),开始加“+”符号实际上是可选的,因为这是没有符号的默认操作。(默认情况下,可以使用--exclude from=FILE使用相反的“-”
  • 双星“**”表示“任何路径”
  • 三星“***”表示“任何路径,包括此目录”

简易方法

您可以启动过滤器“*/”,允许rsync降低所有子级别。这很方便,但是:

  • 所有目录都将包括在内,尽管是空的。这可以通过rysnc选项-m来修复,但是所有的空目录都将被跳过
1) 创建包含筛选器文件,例如“include_filter.txt”:

2) 运行它:

请注意,添加的选项-m.

包含和排除的顺序会影响要包含或排除的内容。
如果要包含特定的子目录,则需要先放置它们。

类似的帖子可用。

刚刚在linuxquestions.org上发现了一个类似的问题,这可能会有所帮助:谢谢,问题解决了!Rsync有时真的有一个奇怪的逻辑。重复的——包含和——排除的顺序有关系吗?更新:我刚刚回答了我自己的问题:这很重要。我无法使用--exclude before--include,但它确实可以使用--include before--exclude。过滤规则确实是处理任何比“exclude all.git directories”更复杂的事情的唯一明智的方法。对于我来说,在include模式末尾添加斜杠是不必要的。谢谢
rsync -avz --delete --filter=". pattern.txt" \
    /srv/http/projects/project/ \
    user@server.com:~/projects/project
+ /specs/
+ /specs/install/
+ /specs/install/project1/***
- /specs/**
rsync -avz --delete --include-from=include_filter.txt \
    /srv/http/projects/project/ \
    user@server.com:~/projects/project
+ /**/
+ /specs/install/project1/***
- /specs/**
rsync -avzm --delete --include-from=include_filter.txt \
    /srv/http/projects/project/ \
    user@server.com:~/projects/project