Rsync:仅包含特定子目录(使用外部包含文件)

Rsync:仅包含特定子目录(使用外部包含文件)

我正在使用 rsync 选项include-from="external file"。除此之外,我的问题几乎与这个

我想备份一个非常具体的子文件夹,但通常不备份任何隐藏文件夹。我设法做到这一点的唯一方法是煞费苦心地这样:

+ home/*/.config/libreoffice/
+ home/*/.config/libreoffice/4/
+ home/*/.config/libreoffice/4/user/
+ home/*/.config/libreoffice/4/user/registrymodifications.xcu

# hide the rest ( .local, .wine, most of .config ...)
- home/*/.*/

如果没有最初的 3 行,registrymodifications.xcu将被排除在外,因为它的更高级别的目录是不匹配的,直到它们被最后一行“击中”......所以根据我的经验,我必须将它们全部列入白名单。

有没有更痛苦的方法来做到这一点?(我仍然想将所有备份规则保存在一个外部文件中......)

答案1

在命令行上,我会这样做:

rsync -ai \
    --prune-empty-dirs \
    --include='*/' \
    --include='home/*/.config/libreoffice/4/user/registrymodifications.xcu/***'
    --exclude='*' \
    "$source" "$destination"

这递归地包括所有目录、registrymodifications.xcu子目录及其下的所有文件,但随后排除其他规则未明确包含的所有内容。它还使用--prune-empty-dirs( -m),这意味着不会在目标上创建空目录。

效果是只有与第二个包含规则匹配的文件和目录才会真正被传输。

或者,作为过滤器文件:

+ */
+ home/*/.config/libreoffice/4/user/registrymodifications.xcu/***
- *

...您将用作

rsync -ai \
    --prune-empty-dirs \
    --include-from=patterns \
    "$source" "$destination"

对此需要注意的是,匹配第二个包含规则的空目录将不是由于该--prune-empty-dirs选项,可以在目标上创建。

相关内容