Linux 用 tar 归档项目目录:先列清单,再在空目录演练恢复

2026-10-21 / 0 评论 / 3 阅读

Linux 用 tar 归档项目目录:先列清单,再在空目录演练恢复 教程示意图

编写日期:2026-10-21。

适用场景

修改脚本、调整配置样本或交接一个小项目以前,常常需要把整个目录打成一个文件保存。只看到归档文件已经生成,并不能证明恢复路径正确,也不能证明里面包含了隐藏文件。本教程用一个独立实验目录,完成创建归档、查看清单、恢复和内容核验。

适用对象是普通静态文件项目,例如文档、脚本和已经停止修改的配置副本。运行中的数据库、虚拟机磁盘和持续写入的业务目录需要对应的备份机制,不能仅靠本例保证一致性。全部步骤都以普通用户执行,不需要管理员权限。

原理:归档成员名称决定恢复位置

GNU tar 把文件内容以及部分文件属性组织成一个归档文件。归档和压缩是不同概念,本教程使用未压缩的 tar 文件,先把路径关系学清楚。

归档里的每个项目都有成员名称。如果名称是 project/readme.txt,恢复时会在目标目录下面创建 project,再写入文件。目录切换参数可以让归档成员从指定目录开始记录,避免把个人主目录的完整路径写进去。

创建操作会写入指定归档文件,因此不能用创建操作向旧归档“补充几个文件”。同名旧归档可能被覆盖。另一个关键点是:归档应放在源目录外面,防止打包时把输出文件也纳入扫描范围。

准备工作

下面所有命令在同一个 Bash 终端中依次执行。先检查使用的是 GNU tar,再创建一个自动生成名称的练习目录:

tar --version
lab_dir=$(mktemp -d "$HOME/tar-practice-XXXXXX")
mkdir "$lab_dir/project"
printf '%s\n' '归档恢复练习' > "$lab_dir/project/readme.txt"
printf '%s\n' 'mode=training' > "$lab_dir/project/.settings"
printf '%s\n' "$lab_dir"

lab_dir 保存本次练习目录的实际路径,不需要手动替换。主目录变量指向当前用户自己的目录。随机后缀用于避免与既有文件重名;请记下最后输出的路径,终端关闭后变量不会自动保留。

这里特意准备一个隐藏文件,后续检查能帮助发现只使用星号选择源文件时容易遗漏隐藏项目的问题。

分步骤操作

第一步:从父目录创建归档

tar --create --file="$lab_dir/project-20261021.tar" --directory="$lab_dir" project
printf '创建操作退出码:%s\n' "$?"

创建参数选择操作类型,文件参数指定输出归档,目录参数让后面的 project 相对于练习目录解释。归档位于 project 外部,成员名称以 project 开头。最后一条命令要紧接着执行,显示前一条操作的退出码;非零时先阅读错误,不要继续宣布归档成功。

如果实际项目仍在变化,归档过程中可能出现文件读取期间发生变化的提示。应先停止相关写入,或者使用业务支持的一致性备份方案,再重新创建新的归档,而不是忽略提示。

第二步:先查看成员清单

tar --list --verbose --file="$lab_dir/project-20261021.tar"

应能看到项目目录、说明文件和隐藏设置文件。详细清单还会显示大小、权限等信息。确认成员名称都是预期的相对路径,没有异常的上级目录跳转,也没有与项目无关的敏感文件。

清单只能说明归档可以被读取、成员名称符合预期,不能代替恢复演练。对于来源不明的归档,即使清单看起来正常,也不应以管理员身份在重要目录直接展开。

第三步:在新目录恢复全部内容

mkdir "$lab_dir/restore-all"
tar --extract --file="$lab_dir/project-20261021.tar" --directory="$lab_dir/restore-all"

恢复结果应该出现在 restore-all 下面的 project 目录,而不是直接铺到 restore-all 根部。这里没有删除原文件,也没有向原项目写入,路径判断出错时更容易清理。

第四步:再演练单文件恢复

mkdir "$lab_dir/restore-one"
tar --extract --file="$lab_dir/project-20261021.tar" --directory="$lab_dir/restore-one" project/readme.txt

最后一个参数必须与清单中的成员名称一致。不能因为当前所在目录不同,就省略成员名称前面的 project。单文件恢复适合找回一个误改的脚本或说明文档,也方便先检查旧版本,再决定是否用于正式回退。

验证方法

diff -r "$lab_dir/project" "$lab_dir/restore-all/project"
printf '目录比较退出码:%s\n' "$?"
cat "$lab_dir/restore-one/project/readme.txt"

对于本例的普通文本文件,目录比较没有输出且退出码为零,表示两个目录的文件内容没有发现差异;单文件读取应显示最初写入的中文内容。这个检查不证明所有权限、扩展属性或访问控制列表都完整一致,也不适合作为复杂系统迁移的唯一验收方法。

还应人工确认隐藏文件已经恢复,并确认单文件恢复目录里没有意外展开整个项目。实际备份要把归档复制到独立存储位置;源目录和归档都放在同一块磁盘上,不能抵御该磁盘损坏。

常见错误

提示找不到成员时,重新查看清单,检查大小写和目录前缀。提示无法写入归档时,检查目标目录权限和剩余空间,不要直接改用管理员权限。恢复文件散落在错误目录时,应检查是否遗漏目录参数,而不是用移动命令匆忙修补。

不要通过给同一个归档再次执行创建操作来添加文件。也不要认为普通 tar 文件天然加密,项目中的敏感内容仍然可能被有权读取归档的人查看。

安全与回退

正式恢复时继续使用独立空目录,先比较内容,再按照业务变更流程替换目标文件,并保留替换前副本。练习结束后,在文件管理器中按记录的完整路径确认实验目录,仅删除本次生成的练习数据。整个演练不需要删除真实项目,也不需要在系统根目录展开归档。

参考资料与转载说明

本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。

评论一下?

OωO
取消