rsync 与过滤器仅包含特定目录树的某些文件类型

rsync 与过滤器仅包含特定目录树的某些文件类型

我的 rsync 命令如下所示:

rsync --update -rav --filter="merge $HOME/mergefilter.txt" ~/ (remote_destination):~/

我的 mergefilter.txt 文件如下所示:

+ /directory_1/***
+ /directory_2/***
+ /directory_etc/***
- /**

rsync命令运行良好,可以更新指定目录树中的所有内容。不过,我希望为其添加一些细节。我不确定必要的语法,但对于我的目录树之一,我只想包含某些文件。例如,想象我的 mergefilter.txt 的工作方式如下:

+ /directory_1/***
+ /directory_2/*** --include="*.c++" --include="*.h" 
+ /directory_etc/***
- /**

这样,当同步directory_2目录树(及其子目录)时,仅更新.c++和.h文件。

我查看过其他 stackexchange 页面,询问类似的问题,但没有一个页面演示如何include在使用过滤器文件时使用。这里正确的语法是什么?

答案1

您已经在使用include;以 开头的每一行+都是一个包含规则;以 开头的每一行-都是排除规则。

如果您只想包含某个目录中的特定文件,那么不幸的是您必须将其拼写出来。您的过滤器文件将变为:

+ /dir_1/***
+ /dir_2/
+ /dir_2/**.c++
+ /dir_2/**.h
+ /dir_2/**/
- /dir_2/**
+ /dir_etc/***
- /*

首先,您必须确保dir_2包含:+ /dir_2/

接下来,您将包含其中的*.c++所有*.h文件dir_2;请记住,**匹配所有字符,包括斜杠。

接下来,您还必须包含dir_2:中的所有目录+ /dir_2/**/,否则找不到子目录中的文件,因为这些子目录被排除在外。

最后排除所有其他文件。

请注意,您还可以使用每个目录的合并文件,因此 rsync 将检查每个目录中是否有给定的文件名,如果找到,则使用该文件作为该目录的附加过滤器。请参阅-F联机帮助页中的选项。

相关内容