我正在使用 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
选项,可以在目标上创建。