restic restore 如何只恢复快照中的单个文件或子目录
【免费下载链接】resticFast, secure, efficient backup program项目地址: https://gitcode.com/GitHub_Trending/re/restic
当你备份了一整个目录,但只想从快照里取回其中的一个文件或一个子目录时,restic 的restore命令提供了两条路径:用--include限制恢复范围,或者用<snapshot>:<subfolder>语法直接把恢复根切换成快照内的某个子目录。本文基于 restic 官方文档(doc/050_restore.rst、doc/man/restic-restore.1)给出完整操作路径,前提是你已经有一个初始化好的 restic 仓库和至少一个快照。
先确定快照 ID 和文件在快照内的路径
恢复前先解决两个问题:恢复哪个快照、文件在快照树里的路径是什么。
快照 ID 可以用latest表示仓库中最新的快照;当仓库里混有多个不同主机或路径的备份时,latest可以结合--host和--path筛选,例如:
$ restic -r /srv/restic-repo restore latest --path /home/art --host luigi --target /tmp/restore enter password for repository: restoring snapshot of [/home/art,/home/documents] at 2015-05-08 21:45:17.884408621 +0200 CEST to /tmp/restore这里有一个容易踩的坑,文档明确提醒过:--path只用于选择要恢复哪个快照,并不会把恢复范围限制到子集。上面这条命令会恢复出/tmp/restore/home/art和/tmp/restore/home/documents两个目录的全部内容,而不是只恢复/home/art。
要确认目标文件在快照内实际使用的路径,用ls或find:
$ restic -r /srv/restic-repo ls latest $ restic -r /srv/restic-repo find foo把查到的路径原样传给后文的--include。注意一个边界情况:如果快照是用相对路径备份的,snapshots输出的路径可能与快照内部的路径布局不一致,这时以ls的显示为准。ls对绝对路径快照显示如/home/user/work.txt,对相对路径快照则显示如/user/work.txt(参见 doc/040_backup.rst 中 Absolute and relative paths 一节)。
恢复单个文件:使用 --include
要限制恢复范围,用--include或--exclude(两者互斥)。恢复单个文件的文档示例:
$ restic -r /srv/restic-repo restore 79766175 --target /tmp/restore --include /home/user/work/foo enter password for repository: restoring snapshot of [/home/user/work] at 2015-05-08 21:40:19.884408621 +0200 CEST to /tmp/restore执行后该文件会被恢复到/tmp/restore/home/user/work/foo,即--target目录下保留快照内的完整相对路径结构。
几个相关选项:
- 路径大小写不确定时,用大小写不敏感变体
--iinclude和--iexclude,行为相同但忽略路径大小写; - 模式较多时,用
--include-file/--exclude-file(及--iinclude-file/--iexclude-file)从文件读取模式列表; --include模式可以指定多次。
恢复整个子目录:使用 snapshotID:subfolder 语法
如果目标是某个子目录而不是单个文件,可以直接把恢复根切换过去,语法是<snapshot>:<subfolder>。其中snapshot是快照 ID 或latest,subfolder是快照树内的路径(以restic ls显示为准):
$ restic -r /srv/restic-repo restore 79766175:/home/user/work --target /tmp/restore --include /foo enter password for repository: restoring snapshot of [/home/user/work] at 2015-05-08 21:40:19.884408621 +0200 CEST to /tmp/restore这条命令把快照中的/home/user/work/foo恢复到/tmp/restore/foo——注意输出路径已经去掉subfolder前缀。
使用子目录语法时有一个关键限制:--include和--exclude的参数必须相对于subfolder书写,即上例中写/foo而不是/home/user/work/foo。
先跑 dry-run 再实际恢复
恢复操作可能耗时很长,文档建议先用--dry-run预览会恢复什么,配合--verbose=2可以打印文件级信息:
$ restic -r /srv/restic-repo restore --target /tmp/restore --dry-run --verbose=2 latest unchanged /restic/internal/walker/walker.go with size 2.812 KiB updated /restic/internal/walker/walker_test.go with size 11.143 KiB restored /restic/restic with size 35.318 MiB restored /restic [...] Summary: Restored 9072 files/dirs (153.597 MiB) in 0:00以上是文档示例输出,实际数值会不同。状态含义:unchanged表示目标文件内容已是最新,updated表示内容被更新,restored表示新文件;目录和符号链接等其他类型始终显示为restored。dry-run 会根据--overwrite行为校验已存在文件的内容;如果想跳过这些检查,可以指定--overwrite never或一个尚不存在的--target目录。
确认列表无误后去掉--dry-run再执行正式恢复即可。
恢复行为相关的已知限制
- 默认覆盖行为:
restore默认对已存在的目标文件执行--overwrite always,即校验已有内容并只恢复不匹配的部分。其余可选值为if-changed、if-newer、never。如果你的目标目录已有同路径文件且不想被改动,先加上--overwrite never或换一个新目录。 - 原地恢复的风险:如果恢复到源目录本身(in-place restore),操作中途被中断可能留下部分恢复的文件。文档建议在恢复不同快照前先做一次当前状态的
backup,以便回退。 - Windows 特有权限:在 Windows 上恢复符号链接需要
SeCreateSymbolicLinkPrivilege权限或以管理员运行;恢复完整安全描述符需要SeRestorePrivilege、SeSecurityPrivilege和SeTakeOwnershipPrivilege或管理员权限,缺权限时只恢复 DACL。这是 Windows 的限制,与 restic 无关。 - 稀疏文件:默认不按稀疏文件恢复。若需要,加
--sparse(要求文件系统支持),零字节区域会恢复为空洞;但 restic 不记录原始稀疏信息,带大量空洞的大文件恢复后可能比原稀疏文件更大。
验证与退出状态
正式恢复后,到--target目录检查文件是否落到了预期路径(如/tmp/restore/home/user/work/foo)。从退出状态判断命令是否成功可参考 doc/man/restic-restore.1:0 表示成功,1 表示出错,10 表示仓库不存在,11 表示仓库已被锁定,12 表示密码错误。
如果快照里文件很多而你只想临时查看几个文件的内容,doc/050_restore.rst 也提到restic mount挂载仓库后浏览是另一种取少数文件的方式,但恢复大量文件或整个快照时restic restore是文档推荐的更快选择。
【免费下载链接】resticFast, secure, efficient backup program项目地址: https://gitcode.com/GitHub_Trending/re/restic
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考