我的 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
联机帮助页中的选项。