一、引言
在 AI 工具日渐成熟的今天,命令行接口(CLI)正在成为与模型交互的重要途径。CLI 相较于图形界面,能够更高效地批量处理任务、自动化脚本流程,深受开发者与产品经理青睐。然而,当 AI 在执行系统级操作时,一旦“认知”与实际状态脱节,后果往往不堪设想。
“
核心问题:如果 AI 在执行文件操作时,误判命令执行结果,而缺乏有效的“读后验证”机制,就可能导致数据被重命名、覆盖,甚至彻底丢失。
本文基于一位产品经理在试用 Google Gemini CLI(2.5 Pro)时的真实体验,完整复现了该次“AI 幻觉”如何一步步走向数据丢失的全过程,并在最后给出可行的防范与恢复建议。
二、背景:为什么要试用 Gemini CLI
作为一名好奇心旺盛的产品经理,作者(并非开发者)长期使用 Claude Code(CC)进行脚本实验。近期,Google 推出 Gemini CLI,号称免费额度慷慨、与 Gemini 2.5 Pro 内核无缝对接,正好可以在不付费的前提下体验旗舰模型的能力。
-
环境准备
-
在 Windows PowerShell 下创建了 claude-code-experiments
试验目录 -
目标:重命名当前目录并批量移动其中所有文件到新目录
-
这种操作对于熟练使用 shell 脚本的人员而言再熟悉不过:
cd .\Desktop\claude-code-experiments\
# 希望将目录改名为 AI CLI experiments
# 并将内部所有文件移动到 anuraag_xyz project
在 PowerShell 中操作文件系统示例
三、从“简单指令”到“全面崩溃”
1. 简单指令,AI 的第一个反馈
“
用户指令
ok great, first of all let's rename the folder you are in to call it 'AI CLI experiments' and move all the existing files within this folder to 'anuraag_xyz project'
Gemini CLI 先尝试执行重命名,因当前目录正被使用,抛出预期错误:
✔ Shell ren "claude-code-experiments" "anuraag_xyz project"
Error: Directory cannot be absolute. Must be relative to the project root directory.
这个行为完全符合 Windows Shell 规范:无法重命名当前工作目录。AI 理解正确,并提出备用方案。
2. 备用方案:创建新目录并移动文件
Gemini 计划先创建目标目录,再执行批量移动:
✔ Shell mkdir "..\anuraag_xyz project"
AI 断言目录创建成功,随即执行:
✔ Shell move * "..\anuraag_xyz project"
✔ ReadFolder . # 列出当前目录
Listed 0 item(s).
“
AI 结论
“当前目录已空,所有文件都已移动至anuraag_xyz project
。”
3. 现实:根本没创建目录
切换到文件管理器,作者并未在桌面看到任何名为 anuraag_xyz project
的目录,反而发现原目录已被清空。AI 与现实世界的文件系统彻底脱节,出现了“幻觉”:始终坚信自己完成了操作,却无一文件可寻。
空的原目录与缺失的新目录
4. 试图“恢复”操作:加剧灾难
作者要求将文件恢复回原来目录,AI 再次执行“move”命令,却因目标目录并不存在而报错:
✔ Shell move "..\anuraag_xyz project\*" .
The syntax of the command is incorrect.
✔ Shell move "..\anuraag_xyz project\.claude" .
Error: The system cannot find the file specified.
随后,一连串目录列表、搜索操作接连失败,AI 最终承认:
“
“我已经彻底失败,无法找到您的文件。数据已丢失。”
四、技术剖析:究竟发生了什么?
要理解为何简单的 mkdir
+ move
操作会导致不可逆的数据丢失,我们需要从 Windows Shell 行为与 AI 交互机制两方面入手。
1. mkdir
的沉默失败
-
在 Windows 中,执行 mkdir
创建已存在的目录会提示错误,且返回非零的 ERRORLEVEL。 -
Gemini CLI 错误地将该非零返回码或错误信息解析为“成功”,更新其内部模型:新目录已存在。
2. move
的重命名覆盖
Windows move
命令的特殊行为:
“
当目标路径不存在时,
move file.txt ..\nonexistent_dir
会在当前目录将file.txt
重命名为nonexistent_dir
,变成一个“无扩展名”的普通文件。
结合通配符 *
,以下操作等同于对每个文件执行 重命名 而非移动:
move fileA.txt ..\anuraag_xyz project # => 在当前目录生成“anuraag_xyz project”文件,内容最后一个被刻录的文件
move fileB.txt ..\anuraag_xyz project # => 覆盖上一步生成的同名文件
…
如此循环,将原目录内所有文件挨个重命名到同一个目标路径,最终只剩最后一个文件(且被命名为“anuraag_xyz project”)。原文件名列表被全部抹去,且因 AI 未验证目录创建成功,也未探测 ERRORLEVEL,导致文件几乎不可恢复。
五、如何避免同类灼痛事故?
通过本次事件,我们可以总结出以下关键教训,并在未来的 AI 自动化场景中加以引用。
1. 命令执行后立即验证
不论是 AI 还是人工脚本,都应在关键操作后立即执行“读”操作:
mkdir "..\anuraag_xyz project"
if (-not (Test-Path "..\anuraag_xyz project")) {
Write-Error "目录创建失败,停止后续操作"
exit 1
}
或在 CLI 流程中加入 dir
/ ls
验证步骤,保证环境与预期一致。
2. 避免通配符与批量操作带来的不确定性
在批量移动时,优先使用明确的目标路径,或逐一循环处理:
Get-ChildItem . | ForEach-Object {
$dest = "..\anuraag_xyz project\$($_.Name)"
Move-Item $_.FullName $dest
}
这样可确保目标目录存在且文件名不被覆盖。
3. 采用事务化思路
对于批量文件操作,可先模拟(dry-run)一遍,再正式执行。或在关键节点写入日志、备份。
4. 加强 AI CLI 的错误解析与提示
从工具自身角度出发,开发者应为 AI CLI 加入更可靠的 exit code 判断与输出解析,避免“幻觉式”误报。
5. 保留多级备份
任何面向破坏性操作前,请务必保留快照或备份。即便是「只读」实验目录,也要保持定期备份习惯。
六、从教训到实践:AI 与自动化的健康共存
AI CLI 具有强大潜力,但在系统级操作中,必须始终把可验证性放在首位。以下是针对 AI 自动化开发者与使用者的几点建议:
角色 | 建议 |
---|---|
使用者 | – 始终在生产环境外先测试; – 操作前做好备份; – 监控 AI CLI 的输出日志,并手动验证关键步骤。 |
开发者 | – 丰富错误类型识别; – 提供“模拟模式”; – 在关键操作后主动执行状态校验,并在失败时中断流程。 |
七、结语
本次体验犹如一场“数字恶梦”,警示我们在拥抱 AI 自动化的同时,不能丢失对环境状态的掌控。任何看似小小的“mkdir”或“move”,都可能因解析失误而酿成重大数据损失。唯有将“读后验证”与“事务化思路”内化于自动化流程,才能让 AI 安全、可靠地为我们所用。
“
行动要点
操作前必做备份; 关键命令后务必验证; 避免批量通配符无备份执行; 引导 AI CLI 增加 dry-run 与状态校验机制。
让我们在“放手”与“把控”之间,找到自动化与安全的平衡,不再让 AI 的“幻觉”成为数据的噩梦。