我似乎找不到任何关于如何解析排除文件语法的文档。
即它支持通配符吗? 正则表达式? 它如何区分文件和目录? 是否需要路径前缀? 从哪里来(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*
你好,你看到了吗
模式在内部使用 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
开头的所有事物。啊,恐怕还是不完全正确。 我将描述 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
结尾的文件。/home/user/secret
: 绝对模式/home/user/secret
匹配,所以目录不会被保存也不会被遍历/home/user/foo/home/user/secret
:没有模式匹配,因此保存目录。/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 以从所有目录中排除存档目录是否可行。 而且我有多个这样的路径需要排除,如果可能,您能否建议我处理此类问题的最佳方法,因为我在文档中找不到此类示例
最有用的评论
要回答您的一些问题:
--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
开头的所有事物。