把一份新目录“覆盖”到旧目录,同名文件已经更新,旧版本才有的文件却还在。这里常常不是缓存没清,而是把复制合并误当成了目录镜像。
这次在 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 辅助整理。