Watch at Ease看见世界,读懂生活。

科技 · 实用指南

cp 提示“preserving times … Operation not permitted”?先证明元数据契约

文件内容可能已复制,但某项元数据更新失败。先保存实际程序、目标对象和首个被拒属性,再决定时间戳、所有权、模式、ACL 或 xattr 是否真的必须保留。

区分字节复制成功与元数据保真的示意图。
Watch at Ease 原创插画:逐项声明并测试必需属性。 Watch at Ease

文件内容可能已复制,但某项元数据更新失败。先保存实际程序、目标对象和首个被拒属性,再决定时间戳、所有权、模式、ACL 或 xattr 是否真的必须保留。

数据写入成功不等于时间戳、所有权、模式、ACL、安全标签或扩展属性都已保留。

1. 固定复制与目标证据

保存完整命令、cp 路径与版本、有效用户、源和目标、退出码及首条未过滤诊断。记录目标是否预先存在及其所有者。

不要立刻 sudo、覆盖唯一目标或丢弃 stderr;这些动作会掩盖失败的是时间、所有者、模式、上下文还是 xattr。

2. 分别比较字节和属性

对一个非敏感样本做哈希或字节比较,再以机器可读方式记录两端类型、大小、所有者、组、模式、atime 和 mtime,并注明时区与精度。只有用途需要时才查 ACL、xattr 和安全标签。

建立“要求、支持、观察值”矩阵。内容哈希正确但 mtime 更新,对普通传输或许可接受,却可能不适合增量备份、可复现构建或法律归档。

3. 区分权限与存储能力

确认实际 cp 实现,因为 BusyBox 与 GNU 选项不同。解析目标文件系统和挂载选项,并用调用者拥有的临时文件复测。

若新文件能保留时间而既有目标不能,查所有权或不可变标志;若都失败,再查目标能力、只读状态、ID 映射或安全策略。sudo 成功只是权限线索,不是自动授权。

4. 选择最窄且声明清楚的修复

若时间戳必需且目标支持,就写入调用者拥有的新对象,或按审查后的权限安排处理。若某属性无关且目标不支持,只省略该属性并记录损失。多项元数据必须保留时,改用归档或文件系统原生工具。

不要为一条未解释诊断做大范围 chmod/chown、全局安全策略修改或递归 sudo。名字和字节到达并不证明 FAT 类存储保存了 Unix 所有权。

5. 按真实用途验收副本

在代表性样本上重复真实流程。关闭并重新打开目标后,核对内容与每项必需属性;比较中包含时区和时间精度。

只有必需矩阵通过、退出策略能区分允许的属性损失与新错误且回滚清楚时才验收。若目标无法满足契约,就更换容器或目标。

目标所有权、调用者权限和文件系统能力的判断门。
Watch at Ease 原创插画:修复前先定位被拒操作。 Watch at Ease