如何在 rsync 中指定每个目录规则?

如何在 rsync 中指定每个目录规则?

INCLUDE/EXCLUDE PATTERN RULES手册页的 部分中,内容如下:

如果模式以 / 开头,则它将锚定到文件层次结构中的特定位置,否则它将与路径名的末尾进行匹配。这类似于正则表达式中的前导 ^。因此,“/foo”将匹配“传输根”(对于全局规则)或合并文件目录(对于每个目录规则)中的“foo”名称。不合格的“foo”将与树中任何位置的“foo”名称匹配,因为该算法是从上到下递归应用的;它的行为就好像每个路径组件都在文件名的末尾轮流。即使未锚定的“sub/foo”也会匹配层次结构中名为“sub”的目录中找到“foo”的任何点。有关如何指定在传输根部匹配的模式的完整讨论,请参阅“锚定包含/排除模式”部分。

如何指定每目录规则?它会产生什么影响?

答案1

编者评论:以下是手册“每个目录的规则和删除”部分的逐字副本rsync(1)

如果没有删除选项,“每个目录规则”仅与发送端相关,因此您可以随意排除合并文件本身,而不会影响传输。例如:

rsync -av --filter='dir-merge /.rsync-filter' --exclude=.excl host:src/dir /dest 
rsync -av --filter='dir-merge /.rsync-filter' host:src/dir /dest 


--filter='dir-merge /.rsync-filter' This tells rsync to look for per-directory .rsync-filter files that have
been sprinkled through the hierarchy and use their rules to filter the files in the transfer. If -F is repeated, it is a shorthand for this rule:

但是,如果您想在接收方执行删除操作,并且希望排除某些文件被删除,则需要确保接收方知道要排除哪些文件。最简单的方法是在传输中包含“每个目录合并文件”并使用 --delete-after,因为这可以确保接收方在尝试删除任何内容之前获得与发送方相同的排除规则:

rsync -avF --delete-after host:src/dir /dest 

但是,如果文件不是传输的一部分,则需要指定一些全局排除规则(即在命令行上指定),或者需要在接收端维护自己的每个目录文件。第一个示例如下(假设远程 .rules 文件排除自身):

rsync -av --filter='remote .rules' --filter='remote /my/extra.rules'
   --delete host:src/dir /dest

在上面的示例中,extra.rules 文件可以影响传输的双方,但(在发送方)规则服从于从 .rules 文件合并的规则,因为它们是在每个目录合并规则之后指定的。

在最后一个示例中,远程端从传输中排除 .rsync-filter 文件,但我们希望使用自己的 .rsync-filter 文件来控制接收端删除的内容。为此,我们必须专门排除每个目录的合并文件(以便它们不会被删除),然后将规则放入本地文件中以控制其他不应删除的内容。就像以下命令之一:

   rsync -av --filter=':e /.rsync-filter' --delete \
        host:src/dir /dest
    rsync -avFF --delete host:src/dir /dest

相关内容