Python 覆盖复制目录,为什么删掉的旧文件还在?

 1天前     18  

文章目录

把一份新目录“覆盖”到旧目录,同名文件已经更新,旧版本才有的文件却还在。这里常常不是缓存没清,而是把复制合并误当成了目录镜像。

这次在 Python 3.14.7 中,用两个临时目录和普通文本文件检查了 shutil.copytree(..., dirs_exist_ok=True)。没有操作真实网站或部署目录,也没有测试符号链接、权限或并发写入。

同名文件更新了,多余文件没有消失

实验开始时,源目录只有一个文件:current.txt,内容为 new。目标目录有两个文件:同名文件内容为 old,另外还有一份 removed.txt。

shutil.copytree(src, dst, dirs_exist_ok=True)

执行后,同名文件变成 new,但 removed.txt 依然存在。也就是说,这次复制成功了,目标目录却没有变得与源目录完全一致。

官方文档对这个参数的解释是:允许目标目录已存在,并用源目录中的对应文件覆盖目标文件。它不是“删除目标中所有多余文件”的同步开关。[5]

先明确你想保留什么,再选工具

如果目标目录混着新旧笔记、手工补充文件,保留额外内容可能正是你想要的。此时合并复制并没有错,错的是验收时把它叫成了完整替换。

如果目标应该严格对应一个冻结版本,就不能只抽查一个同名文件是否更新。至少比较双方的相对文件清单,区分三类:仅源端有、仅目标端有、双方都有但内容不同。本实验中,第一类为空,第二类恰好是那份遗留文件,第三类在复制后为空。

发现“仅目标端有”也不要立刻删除。先分清它是旧产物,还是上传文件、配置、日志等独立数据。完整替换的方案应把这些持久数据与可替换产物分开,并保留恢复路径;本文不提供一条不分对象的清空命令。

结论:复制成功,不代表两边相等

用复制合并,就按“该更新的内容是否更新”验收;要求严格替换,就额外核对多余文件。这是两种不同目标,不能用同一个“命令执行成功”代替。

资料核验:2026年10月21日,依据 Python 3.14 官方文档。结果来自临时目录实验,实验目录已退出;不推为任何部署工具的默认行为。本文由 AI 辅助整理。

参考资料

  1. Python 3.14 官方:shutil.copytree()
版权声明:leif 发表于 1天前,共 901 字。
转载请注明:Python 覆盖复制目录,为什么删掉的旧文件还在? | 虎娃博客

Python 覆盖复制目录,为什么删掉的旧文件还在?已关闭评论

评论已关闭...
暂无评论...