循环改名、大小写变化和目标覆盖,都可能在“新文件名符合规则”时仍然失败。下面用五条映射说明该怎样把任务交给 Codex。
五个文件,先保留一个冲突
在练习副本的 files/ 放入五个不同内容的小文本文件:a.txt 写“甲”,b.txt 写“乙”,封面.txt 写“封面”,Readme.txt 写“说明”,notes.txt 写“旧笔记”。项目根目录的 refs.md:
markdown
[甲](files/a.txt)
[乙](files/b.txt)
[封面](files/封面.txt)
[说明](files/Readme.txt)
初版 rename-map.csv:
csv
old,new
files/a.txt,files/b.txt
files/b.txt,files/a.txt
files/封面.txt,files/cover.txt
files/Readme.txt,files/README.txt
files/notes.txt,files/cover.txt
预演必须拒绝整批:封面.txt 与 notes.txt 都要占用 cover.txt。三个问题分别处理:
| 类型 | 本例 | 应对 |
|---|---|---|
| 多源同目标 | 封面、notes 都指向 cover | 阻止执行,修改映射 |
| 循环占位 | a→b、b→a | 两阶段临时名转移,不能顺序覆盖 |
| 仅大小写变化 | Readme→README | 检查目标文件系统,临时名过渡 |
Windows 默认场景把大小写不同视作冲突候选;不能假设所有磁盘、网络共享及 Git 配置都一样。让执行器检查实际环境,跨平台项目还应做大小写折叠冲突检查。
给 Codex 的执行规格
把最后一行改为 files/notes.txt,files/archive-notes.txt,其他四行不变,再发送:
text
根据 rename-map.csv 编写 rename-files.mjs,默认 dry-run,仅 --apply 执行。
范围只能在练习项目内,拒绝绝对路径、.. 越界、符号链接和不存在的源。
读完整映射再执行:检查重复源、折叠大小写的重复目标,以及未参与移动但已存在的目标。
循环中被占用的目标可允许,但先把所有源移到本批唯一临时名,再由临时名转目标。
临时名必须不存在;失败保留实际 journal,不声称自动回滚成功。
更新 refs.md 时按原文一次解析原目标映射,避免 a→b 后又被 b→a 二次替换。
journal.json 记录原路径、临时路径、新路径、每步状态、SHA-256、refs.md 备份。
实现 --rollback:先核对哈希和路径现状,再用两阶段机制恢复;冲突则报告,不覆盖。
先运行 dry-run,给出五条计划及冲突处理证据,再在副本执行 --apply。
可参考带完整程序的批量改名练习。本页给 Codex 的输入与应交付结果;生成代码后,参数必须与它实际生成的帮助信息核对,不能假定模型已照做。
链接标签仍须指向原来那份内容
| 新文件 | 应保留的内容 | refs.md 对应链接目标 |
|---|---|---|
| files/b.txt | 甲 | files/b.txt |
| files/a.txt | 乙 | files/a.txt |
| files/cover.txt | 封面 | files/cover.txt |
| files/README.txt | 说明 | files/README.txt |
| files/archive-notes.txt | 旧笔记 | 原来没有引用 |
以上是教学预期。实际日志应提供前后哈希、五条成功状态及引用差异。临时文件遗留、部分成功、链接指向交换后的错误内容,均应记未完成。
恢复仍存在 a/b 互换,不能逐行反向 rename。执行途中断电时,先盘点源、临时名、目标三处;journal 中只有明确成功的步骤能作恢复依据。文件被占用时,应关闭使用者后重试,不用覆盖选项强行推进。
下一步
继续阅读与你当前问题相关的教程:


