DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

GNU tar 打包绝对路径时提示 Removing leading /

GNU tar 默认移除归档成员名称开头的斜杠。用 -C 明确归档内部的相对路径,核对目录结构,避免为了消除提示而启用绝对路径恢复。

同一个目录,用相对路径打包时没有提示,改成绝对路径后却出现:

tar: Removing leading `/' from member names

归档文件可能已经生成。GNU tar 这条消息说明它正在移除成员名称开头的 /,让恢复时的路径相对于解包目录。它本身不等于打包失败,但也不能据此忽略同次运行中的其他错误。

下面针对 GNU tar。先用 tar --version 确认实现;其他 tar 的提示和选项细节可能不同。

改的是归档成员名称

假设源目录为 /home/example/numbers。直接把这个绝对路径作为输入,GNU tar 默认会把成员保存成 home/example/numbers/...,而不是 /home/example/numbers/...。

-f 后面的归档输出路径可以是绝对路径。触发这条提示的关键是待归档成员使用了绝对名称,不是备份文件存放在哪里。

在脚本里,应检查 tar 命令的退出状态并保留错误输出。不要用 2>/dev/null 一并隐藏读文件失败、空间不足等信息,也不要因为文件存在就认定备份完整。

用 -C 决定恢复后的目录层级

如果希望归档打开后只有一个 numbers 顶层目录,可以先让 tar 切换到它的父目录,再提供相对成员名称:

tar -czf /srv/backups/numbers-new.tar.gz -C /home/example numbers

将这些路径换成实际位置。备份目录必须已存在且可写,numbers-new.tar.gz 必须是本次专用、尚不存在的输出文件,输出位置应在源目录之外。-c 会创建归档,重复使用已有输出名称可能覆盖旧备份。

-C /home/example 影响后面的输入成员 numbers。因此归档内保存的是 numbers/...,不再需要从绝对成员名称上去掉开头的斜杠。

如果恢复流程原本需要保留 home/example/numbers 这层路径,可以从根目录选择相对名称:

tar -czf /srv/backups/numbers-with-prefix-new.tar.gz -C / home/example/numbers

这两个命令的目录结构不同,应选符合恢复流程的一种。-C 是按位置生效的选项,不能随意挪到待处理成员之后,再期待它追溯影响前面的名称。

查看成员名称,再安排恢复

只读列出第一种归档的成员:

tar -tzf /srv/backups/numbers-new.tar.gz

应看到 numbers/ 和它下面的文件,而不是带开头 / 的路径,也不是多出的 home/example 前缀。列出成功只能证明归档可以被读取,不能代替内容完整性和恢复检查。

需要试恢复时,使用自己创建的可信归档和全新、空的隔离目录,先确认空间足够。例如以下目录名必须尚不存在:

mkdir /srv/restore-check-new &&
  tar -xzf /srv/backups/numbers-new.tar.gz -C /srv/restore-check-new

随后检查 /srv/restore-check-new/numbers 的文件、内容和需要保留的属性。不要直接对业务目录做这一步;来源不明的归档也不应直接在有价值文件的目录中展开。

不要仅为消除提示加入 -P

GNU tar 的 -P(--absolute-names)会取消默认的路径保护行为。它不仅影响开头的 /,还允许涉及 .. 的路径行为。绝对成员名称在相应恢复模式下可能指向目标根目录下的文件,超出原本预期的隔离目录。

普通可迁移备份通常用相对成员名称即可。通过 -C 消除这条提示时,也要同步核对恢复脚本依赖的层级。保留旧归档,用新文件名创建并验证新归档;若新布局不符合预期,继续使用已验证的旧归档和原恢复流程,而不是在唯一备份上反复重建。