Restic: 找不到排除文件语法的文档

创建于 2017-06-08  ·  17评论  ·  资料来源: restic/restic

我似乎找不到任何关于如何解析排除文件语法的文档。

即它支持通配符吗? 正则表达式? 它如何区分文件和目录? 是否需要路径前缀? 从哪里来(cwd/或root?)?

一些例子:

.qiv-trash (directory that could be anywhere on the filesystem)
.DS_Store
lost+found/
._*
desktop.ini
Thumbs.db (file that could be anywhere on the filesystem)
.Trash-* (the asterisk could be any number, is it needed?)
.tmp$ (file ending in .tmp)
~$ (file ending in a tilde)
~/.cache/ (cache directory in user home dir, using tilde syntax)
/full/path/to/directory/.syncthing/index*
documentation wanted

最有用的评论

要回答您的一些问题:

  • 所有模式都针对要保存的文件/目录的完整路径进行测试
  • 相对路径/模式将匹配要保存的路径下方的任何位置
  • 目前无法区分文件和目录,因此--exclude foo将排除任何名为foo文件和目录。 --exclude foo/

从您的排除文件中:

  • ._*将匹配名称以点和下划线开头的所有文件和目录
  • desktop.ini将精确匹配所有名为desktop.ini文件。 所以desktop.ini.bak不会被排除并保存在快照中。
  • .Trash-*不包括名为.Trash-.Trash-foobar等的文件/目录。
  • .tmp$不包括字面上命名为.tmp$所有文件/目录,即一个点,后跟tmp ,后跟一个美元符号。 没有正则表达式扩展。
  • ~$不包括字面上命名为波浪号美元的所有文件/目录。 要排除以波浪号结尾的所有文件/目录,请使用*~
  • ~/.cache不包括所有称为波浪号的目录中的.cache目录。 为了仅在您的主目录中排除缓存目录,请使用$HOME/.cache (波浪号未扩展,环境变量是,但仅在通过--exclude-file读取的文件中,在命令行中,shell 扩展两个都)。
  • /full/path/to/directory/.syncthing/index*排除在/full/path/to/directory/.syncthing以下名称以index开头的所有事物。

所有17条评论

你好,你看到了吗

模式在内部使用 filepath.Glob,语法参见 filepath.Match。 另外 ** 排除任意子目录。 排除文件中的环境变量用 os.ExpandEnv 扩展。

https://github.com/restic/restic/blob/master/doc/manual.rst?

我认为这应该回答你的问题。

我访问了https://restic.readthedocs.io/en/latest/manual.html上的文档并搜索了排除,不幸的是它不包含任何常见示例(或对 manual.rst 上的其他文档的引用) ) :/

我阅读了 golang 文档,我认为最终用户(我!)不会知道什么是 restic 将排除与内部进行比较 - 它是完整路径(例如 /home/me/blah)还是来自存储库根目录(/blah 或 blah),或相对于 cwd(当我在 /home 时是 me/blah)?

感谢您提出这个问题,我认为您的观点有道理。 手册应该在不参考 godoc.org 的情况下解释排除过滤器,并且需要更多示例。

要回答您的一些问题:

  • 所有模式都针对要保存的文件/目录的完整路径进行测试
  • 相对路径/模式将匹配要保存的路径下方的任何位置
  • 目前无法区分文件和目录,因此--exclude foo将排除任何名为foo文件和目录。 --exclude foo/

从您的排除文件中:

  • ._*将匹配名称以点和下划线开头的所有文件和目录
  • desktop.ini将精确匹配所有名为desktop.ini文件。 所以desktop.ini.bak不会被排除并保存在快照中。
  • .Trash-*不包括名为.Trash-.Trash-foobar等的文件/目录。
  • .tmp$不包括字面上命名为.tmp$所有文件/目录,即一个点,后跟tmp ,后跟一个美元符号。 没有正则表达式扩展。
  • ~$不包括字面上命名为波浪号美元的所有文件/目录。 要排除以波浪号结尾的所有文件/目录,请使用*~
  • ~/.cache不包括所有称为波浪号的目录中的.cache目录。 为了仅在您的主目录中排除缓存目录,请使用$HOME/.cache (波浪号未扩展,环境变量是,但仅在通过--exclude-file读取的文件中,在命令行中,shell 扩展两个都)。
  • /full/path/to/directory/.syncthing/index*排除在/full/path/to/directory/.syncthing以下名称以index开头的所有事物。

谢谢@fd0

因此,对于“当前目录”,您并不是指我启动备份时所在的目录,而是 restic 当前正在检查文件的目录(除了以斜杠开头的 excludes 之外)。 知道了。

文件和目录的行为有点出乎意料,我本来希望 --exclude foo/ 备份目录而不是内容,而 --exclude foo 既不备份。 不知道为什么,我猜是 rsync。

我的例子漏掉了一个重要的例子:空格! 我想我需要用反斜杠转义这些和 shell 元字符。

我最终复制了很多这些: https :

排除文件中是否允许注释? 编辑: https :

啊,恐怕还是不完全正确。 我将描述 restic 如何评估排除模式。 假设 restic 由用户在其主目录 ( /home/user ) 中运行,如下所示:

$ restic backup --exclude='*.bak' --exclude='/home/user/secret' --exclude='extra' ~

然后 restic 将看到以下命令行参数(在被 shell 扩展后):

["restic", "backup", "--exclude='*.bak'", "--exclude='/home/user/secret'", "--exclude='extra'", "/home/user"]

然后,它开始遍历/home/user 。 下面的列表描述了当看到指定的文件/目录时会发生什么。 restic 总是针对模式测试完整的路径:

  • 文件/home/user/foo.bak :模式*.bak匹配,文件未保存。 该模式不是绝对的,因此它匹配所有以.bak结尾的文件。
  • dir /home/user/secret : 绝对模式/home/user/secret匹配,所以目录不会被保存也不会被遍历
  • dir /home/user/foo/home/user/secret :没有模式匹配,因此保存目录。
  • dir /home/user/work/extra :模式extra匹配,目录不保存。

我希望现在更清楚一点,我将在手册中添加一个部分来描述该过程。 关键点是在备份期间根据文件的完整路径评估模式。 所以如果你想匹配单个目录,使用完整路径,否则它可能会在某处匹配多次。

还有什么问题吗? :)

我还有其他问题,非常感谢您花时间回答这些问题。 这确实是一个关于模式自动锚定的问题。 我想我可以猜到答案(我们依赖绝对路径相当独特并为我们提供我们想要的行为),但最好询问并确定。

绝对模式/home/user/secret匹配/home/user/secret2吗? (如果你不想呢?)
绝对模式/home/user/secret匹配/home/user/somemount/home/user/secret吗?

在这两种情况下:不,模式将不匹配。

这是为什么? 编辑:我很高兴它没有,但我不明白为什么会这样:)

那里的匹配代码模仿了 shell 会做什么:如果你问自己,如果文件/home/user/secret2存在, ls /home/user/secret打印什么(提供文件secret不存在)?

在更正式的术语中:如果模式以/开头,则它是绝对的,并且模式必须在被测字符串的开头匹配,因此模式/home/user/secret/home/user/somemount[...]不匹配

您可以自己想象模式和文件路径都被拆分为各自的组件:

  • /home/user/secret被拆分为[ROOT, "home", "user", "secret"]并且文件/home/user/somemount/home/user/secret被拆分为[ROOT, "home", "user", "somemount", "home", "user", "secret"] 。 本示例中使用字符串ROOT来标记根目录。 您可以看到文件名中不包含该模式。

    • 让我们看看文件/home/user/secret2 ,它被分成了[ROOT, "home", "user", "secret2"] 。 您再次可以看到该模式未包含在文件名中。

  • 对于拆分为[ROOT, "home", "user", "secret", "secret.txt"]的文件/home/user/secret/secret.txt ,您可以看到该模式确实包含在文件名中,就在开头: [ROOT, "home", "user", "secret", ...] ,因此模式匹配并且文件被排除在外。
  • 假设我们有一个secret/secret.txt的相对排除模式,它被拆分为["secret", "secret.txt"] 。 您可以看到此模式可以在文件/home/user/secret/secret.txt的列表中找到,从偏移量 3 开始: [ROOT, "home", "user", "secret", "secret.txt"] ,因此模式匹配。

当路径组件中有通配符( *?等)时,它们也会被测试。 因此,对于您的第一个示例, /home/user/secret*将匹配路径/home/user/secret2

我认为所有这些示例都应该记录在手册中。

明白了。 谢谢。

否定排除可能的 ala .gitignore 吗?
说我想排除名为 .meteor 的目录中的所有内容,除了嵌套目录 .meteor/local/db,我可以这样做吗?

/etc/restic/excludes:
.meteor/ !.meteor/local/db
restic backup exclude-file=/etc/restic/excludes

不,这还没有实施。

记录包含/排除示例在 #396 中进行了跟踪,我将在此处关闭此问题。

@fd0我正在尝试排除如下所示的路径 jobs/ /jobs/ /builds/**/archive 以从所有目录中排除存档目录是否可行。 而且我有多个这样的路径需要排除,如果可能,您能否建议我处理此类问题的最佳方法,因为我在文档中找不到此类示例

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

相关问题

ikarlo picture ikarlo  ·  4评论

kontakm picture kontakm  ·  4评论

reallinfo picture reallinfo  ·  4评论

fd0 picture fd0  ·  3评论

e2b picture e2b  ·  4评论