Restic: 允许混合包含和排除备份和恢复模式

创建于 2015-07-18  ·  17评论  ·  资料来源: restic/restic

这是#226 的后续问题。 到目前为止,只能为备份和恢复指定排除模式。

有些用例未涵盖,例如: 用户希望在/home/user备份她的主目录,不包括目录work任何内容,但 C 源文件除外。

还有其他我没有想到的用途吗?

实现/用户界面:允许在命令行上指定--include--exclude模式,它们填充一个公共列表(顺序在这里很重要)。 对于每个目录/文件,检查列表中的所有模式。 最后一个匹配模式的操作(排除或包含)获胜。 默认操作(如果既没有指定包含模式也没有指定排除模式也将使用)是“包含”。

这已经包含一个角落案例:是否应该restic walk /home/user/work

我认为不应该。 相反,如果这是一种理想的行为,则要求用户添加更具体的模式来表示也应该遍历排除的目录,例如restic backup --exclude /home/user/work --include /home/user/work/**/*c. /home/user

一个更好的用户界面是允许指定一个文件来读取模式( --pattern-file或类似的东西)。 在此文件中,所有以#开头的行都是注释,空行被忽略,所有其他行必须以+ (包含)或- (排除)开头,并在空格后字符和模式。 对于上面的用例,过滤器文件如下所示:

# filter out everything from work, but include c source code files
- /home/user/work
+ /home/user/work/**/*.c

一旦实现了包含和排除模式的最终解决方案,就可以关闭此问题。

backup restore feature enhancement

最有用的评论

为什么不直接使用.gitignore使用的标准忽略格式? 例如。

# ignore everything
*
# include $HOME/.local
!$HOME/.local

所有17条评论

另一种可能性是从文件(或从标准输入)读取要备份的文件的确切列表。 然后人们可以使用他们想要的任何工具(find、grep 等)来构建他们的列表并将该列表“管道”到 restic。

在发布回复之前,我应该阅读全文。 对不起。

这是一个不同的问题,从标准输入而不是命令行参数获取要备份的文件/目录列表。 你认为拥有它有价值吗? 如果是这样,您可以添加一个问题吗?

只是提醒我自己:这个问题是关于包括备份过滤器,恢复已经有了它们。

您也许应该只复制 rsync 的 --exclude/--include/--exclude-from 语法,他们有 20 年的经验:-)
(至少请在用户指南中添加一些当前语法的示例,因为不清楚“/foo”和“foo”是否相同或是否支持“*.c”。

啊,感谢您的评论,我已经为手册中缺少的示例添加了一个问题: https :

老实说,我根本不喜欢 rsync 的过滤器语法,因为规则太复杂了。 但我们会看看我们能想出什么。

任何更新? 这绝对是一个必备的选择。 目前甚至无法从标准输入读取要备份的文件列表:

$ find -name '*.go' | restic backup --files-from -
open -: no such file or directory

而它可以写成

restic backup --exclude '*' --include '*.go'

嗯,从stdin读取文件列表可以通过调用restic实现,如下:

$ find -name '*.go' | restic backup --files-from /dev/stdin

如果你愿意,我会接受一个 PR,为--files-from添加处理- --files-from 。 :)

@opennota你介意描述一下你的用例吗? 对我们来说会很有趣。

破折号 ( - ) 问题被跟踪为 #769。

@fd0
没有太多的用例。 我只想备份具有某些扩展名的文件,而不使用列表的临时文件。

如果您愿意,我会接受增加处理的 PR - for --files-from。 :)

我会看看我能做什么。

您可以使用sed和命名管道模拟这种行为:

restic --exclude-file <(sed -n 's/^- \(.*\)/\1/p' files.list) --files-from <(sed -n 's/^+ \(.*\)/\1/p' files.list)

排除以-开头的行,包括以+开头的行。

我认为一个好的模型是博格最近为 --pattern 和 --patterns-from 实现的
https://borgbackup.readthedocs.io/en/stable/usage/help.html#borg -help-patterns
与其说是不同的样式选择器,不如说是在文件中指定根路径、包含规则、排除规则和无递归排除规则的选项。

为什么不直接使用.gitignore使用的标准忽略格式? 例如。

# ignore everything
*
# include $HOME/.local
!$HOME/.local

--include 计划实施?

听起来像--include 和--exclude 不能一起实现,或者至少是一个优先级层次结构......

提供带有--files-from的文件列表并不能完全解决问题,因为snapshots子命令将显示巨大的文件列表,而forget子命令无法按预期工作。

我的用例正在备份我的家,我有一个路径列表,其中包含一些排除项和一些排除项的例外情况。 路径的基本列表已经包含一百个项目。 由于所有内容都在$HOME ,我希望能够说--exclude=** --include=~/path1 --include=~/path2 --exclude=~/path2/something --exclude=*~ 。 因此,要确定是否应该包含路径,它应该以正确的顺序与每个--exclude--include进行匹配,最后匹配的获胜。

我认为@vincentbernatPR是满足这一要求的有效解决方案。

_总结:允许 gitignore 风格的否定模式为备份和恢复指定排除规则。_

我已经有效地使用它几个星期了。

值得注意的是,这使我能够简化之前非常冗长的快照列表:

b951f6a2  2019-06-15 11:30:18  elvandar    manual      /Users/daniel/Desktop
                                                       /Users/daniel/Documents
                                                       <lots more...>

到:

d0c0bed1  2019-06-18 08:20:57  elvandar                /Users/daniel

此外,我已经实施了一个有效(不完美但有效)的解决方案,使用此功能提供连续备份(稍后将分享详细信息)。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

TheLastProject picture TheLastProject  ·  3评论

jpic picture jpic  ·  3评论

cfbao picture cfbao  ·  3评论

axllent picture axllent  ·  4评论

viric picture viric  ·  5评论