news 2026/9/11 14:23:06

restic restore 如何只恢复快照中的单个文件或子目录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
restic restore 如何只恢复快照中的单个文件或子目录

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

要确认目标文件在快照内实际使用的路径,用lsfind

$ 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 或latestsubfolder是快照树内的路径(以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-changedif-newernever。如果你的目标目录已有同路径文件且不想被改动,先加上--overwrite never或换一个新目录。
  • 原地恢复的风险:如果恢复到源目录本身(in-place restore),操作中途被中断可能留下部分恢复的文件。文档建议在恢复不同快照前先做一次当前状态的backup,以便回退。
  • Windows 特有权限:在 Windows 上恢复符号链接需要SeCreateSymbolicLinkPrivilege权限或以管理员运行;恢复完整安全描述符需要SeRestorePrivilegeSeSecurityPrivilegeSeTakeOwnershipPrivilege或管理员权限,缺权限时只恢复 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 14:22:17

MySQL 5.7.44在Windows Server上的安装部署与常见问题排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 14:21:27

Linux write命令:终端实时通讯与系统管理实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 14:21:24

稀疏编码测试阶段详解:MATLAB固定基下系数求解与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 14:20:40

工业自动化中托盘输送机PLC程序开发与优化

1. 托盘输送机程序开发的核心挑战 在工业自动化领域&#xff0c;托盘输送系统作为物流环节的"血管网络"&#xff0c;其程序开发需要兼顾机械运动控制与信息流管理的双重需求。典型的托盘输送机PLC程序需要处理以下核心问题&#xff1a; 多轴同步控制 &#xff1a;输…

作者头像 李华