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

tar 写了 --exclude 仍报 file changed as we read it:排除选项放在了输入后面

归档输出放在输入目录内,排除选项又放在输入参数后,GNU tar 会读到正在变化的归档目录。调整选项顺序与输出位置,并区分真实业务写入。

把项目压缩包放进项目的 artifacts 目录,执行下面的命令时,GNU tar 仍把该目录当成输入,提示 artifacts: file changed as we read it:

tar -zcf artifacts/source_code.tar.gz * --exclude=artifacts

命令中的目录和文件名是示例。--exclude 已经出现,并不意味着它对前面的输入生效。在 GNU tar 的创建和更新操作中,排除等位置相关选项影响它们之后的输入参数,应放在要处理的文件或目录前。

修正参数顺序,同时检查实际归档范围

在项目目录执行时,可以改成以下形式。前提是 artifacts 目录已存在,输出文件名没有覆盖需要保留的旧归档:

tar -zcf artifacts/source_code.tar.gz --exclude='./artifacts' .

--exclude 位于输入 . 之前,排除项目下的输出目录。这里用 . 归档目录内容,也会包括没有被排除的隐藏文件;原命令中的 * 通常由 shell 展开,默认不会匹配以点开头的名称。更换输入形式时,要确认 .env、私有配置和其他隐藏文件是否应该进入归档,再补充对应排除规则。

如果错误还包含下面这样的信息,说明 GNU tar 已经明确指出选项顺序不生效:

tar: --exclude 'artifacts' has no effect

这是示例错误,不是所有版本都会逐字给出同样的提示。跨机器行为有差异时,先看 tar --version 和实际参数顺序,不要把旧机器曾经成功当成新命令写法正确的证据。

输出放到输入目录外,更容易避免读到自身

如果没有必须把归档保存在项目内的理由,可选择项目外的备份目录。例如,项目在 /srv/project,已存在且可写的备份目录是 /srv/backups:

tar -czf /srv/backups/project-before-change.tar.gz -C /srv/project .

路径是示例,需替换成真实位置,并使用新的输出文件名。-C 在输入 . 前切换到项目目录,备份目录不在这次扫描范围内。保留旧归档后再调整脚本,改错时恢复原脚本与此前有效的备份,不需要删除源文件来消除提示。

仍提示文件变化时,检查真实写入者

报错指向业务日志、上传文件或数据库文件时,可能是其他进程在归档期间写入、替换或删除了它们。修正输出位置,只能消除归档读到自身的那一类问题。

需要一致备份时,使用应用支持的导出或一致性快照;必须暂停写入时,先安排维护窗口并明确恢复写入的步骤。直接压缩正在变化的数据库文件,不能仅凭命令结束就认定备份可以恢复。隐藏警告也不会让输入数据静止。

完成后检查 tar 的退出状态、保留的错误输出,以及归档成员列表:

tar -tzf /srv/backups/project-before-change.tar.gz

列表应包含计划备份的文件,并排除不该归档的输出目录或私有内容。需要恢复保障的备份,还应在独立目录按既有备份流程验证恢复;不要解压覆盖当前项目来验收。