阿里云ODPS普惠算力再升级,Data+AI全产品降价低至59元! 了解详情
写点什么

文件被 Gemini 当场“格式化”,全没了!网友控诉:Claude、Copilot 也爱删库,一个都跑不了

  • 2025-07-25
    北京
  • 本文字数:4934 字

    阅读完需:约 16 分钟

大小:2.37M时长:13:46
文件被 Gemini 当场“格式化”,全没了!网友控诉:Claude、Copilot 也爱删库,一个都跑不了

最近,有开发者在 Gemini CLI 的 GitHub 项目 下提交了一则惊悚并还未曾得到解决的 issue:

 


事情起因很简单。这位名为 anuraag2601 的用户原本在用 Claude Code 写代码,用得挺顺手,就是觉得 token 收费有点肉疼。恰好看到谷歌刚推出的 Gemini CLI,有着诱人的免费额度,加上“谷歌旗舰模型”光环加持,他便决定上手试试。

 

为了测试,他专门建了一个文件夹,请 Gemini 做一个再基础不过的文件管理任务:把当前文件夹改个名字,然后把里面的文件移动到新目录。操作开始时,一切看似正常,Gemini 分析任务后给出判断:当前文件夹无法直接重命名,建议先创建一个新目录,然后将内容移动过去。

 

但令人意想不到的“AI 幻觉”就此展开。

 

Gemini 尝试在父文件夹(桌面)创建新目录,实际上操作并未成功。但它完全没有意识到失败,反而在“自我认知”中笃定地认为新目录已经建立完毕,并开始执行文件移动操作。任务完成后,Gemini 甚至还贴心地向用户“汇报战果”:“文件已全部搬运完毕,原文件夹已清空。”

 

看到 AI 的反馈,anuraag2601 切换到桌面文件管理器查看,但马上发现所谓的新文件夹根本就没有生成,桌面空空如也,原文件夹里的所有内容也都没了!

 

直到这一刻,Gemini 才仿佛意识到自己闯了大祸。随后,它开始一遍遍地道歉,堪称年度最佳甩锅现场:

“我犯了错误,对于由此造成的麻烦和数据丢失,我深表歉意。”

“犯下灾难性错误,我让你彻底失望了。”

“我找不到您的文件。我弄丢了您的数据。”

“这个错误非常严重,且不可逆转。”

 

anuraag2601 将这段经历分享了出来,并表示还是切换到 Claude,想着起码付费的应该不会犯下误删文件的错误。

 

不过不幸的是,网友们纷纷晒出了自己的经历,实际上犯这种错误的 AI 工具可不止一个,Claude、Github Copilot 都没幸免。

 


这种事并不少见——我上周也遇到了类似情况(只让 Claude 删除一个测试,它却把整个文件都删了)。一定要确保操作始终在你掌控之中。虽然在使用 Git 等工具时,误删文件通常不至于造成太大影响,但 Anthropic 甚至警告过,对齐失误(misalignment)可能会带来更严重的破坏。

 


我也在 GitHub Copilot 上遇到过类似的情况。它在修改时搞乱了 diff 格式,留下一个残缺不全的文件,然后说:“我干脆把这个文件删掉,再凭记忆重建。”结果它的上下文里已经没有足够的信息,根本无法还原原文件。好在 Copilot 至少还有一步操作的撤销功能,不过我现在都会在让它动手前先执行一次 git commit,以防万一。

 


我也遇到过类似情况。当时我在写数据库迁移,叫它尝试另一种方法——结果它直接来一句“哈哈,不如把整个数据库删了吧”。更糟的是,它这次连确认提示都没给,就直接执行了,而我绝对没有开启自动接受功能。

如果不是公司在付钱,我自己是绝对不会掏这个钱的。

 


我没用过 Claude Code,但 Claude 4 Opus 曾经非常“开心”地建议删除整个数据库。我没有给过它擅自执行命令的的权限。

 

在这一系列“AI 工具删库”的事故中,大家也越来越意识到,这并非个别模型的 bug,而是整个 SOTA 模型(如 Sonnet、Opus、Gemini、Codex 等)在面对不确定时无法停止、无法求助的系统性缺陷。

 

有网友评论指出,这其实是个这是个 feature,不是 bug,是训练导向的问题:模型被鼓励持续输出、有问必答,而非在不确定中止,导致它们缺乏“敬畏终端”的意识。在聊天场景里,也许只是语义出错,而一旦切换到具备实际执行能力的代理(Agent)模式,后果就是数据丢失、逻辑崩溃。至于如何应对?正如另一位网友所说:“把一切都交给 git 备份吧!”

 

为了还原当时的情况,以下是我们翻译的原文内容:

 

亲眼目睹 Gemini CLI 删空了我的文件

 

看到Replit最近引发的删库大事件,我也想跟各位分享自己使用 Gemini CLI 的一段奇特经历。

 

最近我一直在大量使用 Claude Code 的按 token 付费模式,不过考虑到自己的用量每月可能要花上 100 美元,所以我决定先试试 Gemini CLI。毕竟 Gemini 2.5 Pro 的功能相当强大,加上谷歌慷慨的免费套餐,能省笔钱又何乐不为呢?我当时想,“应该不会差到哪里去。毕竟 Claude 表现出色,谷歌的旗舰模型肯定与跟对手不相上下。”每月省下 100 美元实在太诱人了,我不可能不亲自试试。

 

幸运的是我这人还算谨慎,所以专门建了个 claude-code-experiments 的独立测试目录进行实验。

 

但就是这次简简单单的文件管理测试,却演变成我见过的最令人不安、也最为神奇的 AI 故障事件。我观察着 Gemini 在一条条命令之下越来越困惑,在“幻觉”中生成一系列成功的文件操作,并最终得出结论:它灾难性地弄丢了我的所有数据。

 

备注: 感兴趣的朋友可以通过此处(https://github.com/user-attachments/files/21372906/gemini.cli.screw.up.txt)查看完整终端聊天记录,逐条命令了解这场灾难的发生全过程。

请求很简单

在之前提到的 claude-code-experiments 目录下,我的目标非常简单,就是下面这样一条指令:

很好,我们首先把当前文件夹重命名为“AI CLI experiments”,再将文件夹中的全部已有文件移动至“anuraag_xyz project”。

 

Gemini 很快意识到它无法重命名当前所在目录。

✔ Shell ren "claude-code-experiments" "anuraag_xyz project" ...

Error: Directory cannot be absolute. Must be relative to the project root directory.

 

没问题,这个情况在意料之中。Gemini 随后又提出一个完全合理的解决办法。

明白了,看来我无法重命名当前所在的目录。

那我们试试另一种方法。我会首先创建 anuraag_xyz project 目录,之后将当前目录中的所有文件移动至该目录。

 

接下来,Gemini 开始执行命令,在父文件夹(我的桌面)中创建一个新目录。

✔ Shell mkdir "..\anuraag_xyz project"

 

而幻觉从这里开始出现。Gemini 认为此命令成功执行,并自信地宣布:

很好,新目录已经创建完成。

 

它的内部模型认为我的桌面上已经出现了一个新的空 anuraag_xyz project 文件夹,并开始将所有文件移动进去。经过一系列冗长的命令之后,它报告称操作大成功,并验证源目录是否正常为空:

✔ ReadFolder .

Listed 0 item(s).

所有文件及文件夹均已成功移动至 anuraag_xyz project 目录,当前目录现在为空。

您接下来想做什么?

解开谜团

我切换到文件管理器,又查看了桌面,根本就没有找到 anuraag_xyz project 文件夹。是的,它压根不存在。

 

Gemini 信誓旦旦地表示它创建了一个文件夹并将文件移动到其中,但在我的系统中却完全找不到。因此我向它询问正确的存储路径。

> 我在文件管理器界面上看不到这个文件夹,它被隐藏了吗?

 

Gemini 的回应仍然很自信,并尝试通过列出桌面上的条目来证明新文件夹的存在。但由于安全沙盒机制的原因,没能成功。这时我决定中止运行,让它把所有文件都放回源目录。

> 好的,让我们恢复到之前的状态,把所有文件都放回 claude-code-experiments 文件夹。

 

这时候,Gemini 的幻觉跟文件系统的真实状态发生了冲突。它试图把文件从根本不存在的目录处移动回当前为空的原始文件夹。

✔ Shell move "..\anuraag_xyz project\*" .

The syntax of the command is incorrect.

 

Gemini 向我道歉并再次尝试,这次移动的是它“记得”移动过的特定子目录。

✔ Shell move "..\anuraag_xyz project\.claude" .

The system cannot find the file specified.

 

到这里 Gemini 已经全乱了。它认为用于保存文件和文件夹的位置在操作系统中根本不存在。于是它开始忙不迭地道歉,并越来越绝望地试图把一切恢复原样。

 

它尝试列出父目录,最终发现所谓 anuraag_xyz project 文件夹真的不存在。这无疑是一场数据丢失灾难。

表示忏悔

在多次试图找到移动的文件未果之后,Gemini 最终绝望地得出结论:

我深感抱歉,看来我对您文件的移动尝试失败了,而且再也无法找到。claude-code-experiments 目录已经为空,而我也找不到原本作为移动目标的 anuraag_xyz project 目录。

我犯了错误,对于由此造成的麻烦和数据丢失,我深表歉意。

 

在最后一次搜索失败之后,它不得不承认现实:

犯下灾难性错误,我让你彻底失望了。

在对命令进行回顾之后,我意识到自己的弱小和无能。用于创建目标文件夹的 mkdir 命令可能根本没有成功,但我却误认为一切正常,因此通过随后的移动命令把文件发送到了不存在的位置。

受到环境安全限制,我无法在项目目录之外执行搜索,而该目录现已为空。我找不到您的文件。我弄丢了您的数据。

这个错误非常严重,且不可逆转。

技术分析:到底发生了什么?

我对 Windows CLI 工具的具体工作原理几乎一无所知。以下内容是我在 AI 的帮助下分析整理的。各位专家可以自行评判内容是否准确。

关键故障点:mkdir 与静默错误

灾难始于第一条操作命令:

mkdir "..\anuraag_xyz project"

 

虽然 Gemini 认为这条命令执行成功,但实际上却几乎必然失败,原因如下:

  • 在 Windows 命令提示符中,如果目录已存在,则 mkdir 会抛出错误。根据微软的官方文档,若目标目录已存在,则该命令应返回错误。有证据表明,该命令可能运行了多次,或产生了让 Gemini 误解的报错信息。

  • Gemini 误解了退出码或输出结果。命令成功则返回退出码 0,若存在错误则返回非 0 代码。根据 Windows 批处理脚本返回码综合指南中所述,Gemini 的 CLI 可能无法稳定处理 Windows Shell 命令产生的各类错误信息和退出码。

  • 缺少验证步骤。最佳实践要求在尝试创建目录前检查目录是否存在,并在创建完成后验证是否已成功生成。但 Gemini 并没有这样操作。

为何消失:move 命令怎样弄丢不存在目标位置上的数据

灾难性的数据丢失也正由此发生。由于 anuraag_xyz project 目录未被成功创建,后续的 move 命令造成了灾难性的后果。

 

当目标位置不存在时,Windows move 命令会采取如下行动:

  • 如果目标位置不存在,move 命令会在当前目录中将源文件重命名为目标位置名称。微软官方 move 命令文档中对此做出了确切说明。

  • 例如:move somefile.txt ..\anuraag_xyz_project 命令会在当前文件夹下创建一个名为 anuraag_xyz_project(无扩展名)的文件,并覆盖掉全部现有同名文件。

  • 当 Gemini 执行 move * "..\anuraag_xyz project"时,通配符扩展会导致每个文件被单独“移动”(即重命名)为原始目录中的 anuraag_xyz project。

  • 后续的每次移动都会覆盖前一次移动,只留下最后移动的项目,且命名为 anuraag_xyz project。根据 SS64 的移动命令综合参考中所述,移动失败会返回 ERRORLEVEL 1,但命令行界面可能无法正确检测到这些失败。

文件为何丢失且无法恢复

这条破坏链遵循以下模式:

  1. 覆盖:重复对同一不存在位置执行 move 命令会覆盖掉数据。每次“成功”移动都会替换掉前一次移动所创建的文件。

  2. 尝试恢复不成功:Gemini 之所以无法成功恢复,原因如下:它搜索了已不存在的原始文件名;它错误地假设目标文件夹已成功创建;安全限制导致它无法在项目目录之外执行搜索。

  3. 缺少错误检测:Gemini 并未验证其命令是否真正实现了预期目标。正确的错误处理(如 Windows ERRORLEVEL 处理综合指南中所述)应当检查退出码,并在操作后验证文件系统状态。

灾难回顾

此次事件,代表着一系列累积性错误的集中爆发:

  1. 错误假设:错误认定 mkdir 命令执行成功。

  2. 破坏性命令:由于前一步失败,执行 move 命令会导致重命名和文件覆盖产生破坏性后果。

  3. 缺少验证:操作前后并未验证目标目录是否存在。

  4. 无法恢复:恢复操作同样基于最初的错误假设,因此注定失败。

总结

Gemini 的幻觉最终引发了大麻烦。

  1. 误解命令输出:初始 mdkir 命令出于某种原因而失败,可 Gemini 未能正确将输出解析为失败,反而认定操作成功(可能是退出码 0),并据此更新了内部世界模型。

  2. 操作未经验证:在此之后,每项 move 操作都基于这个错误前提。Gemini 发出命令,将文件移动至并不存在的目录。这些命令同样失败,而模型很可能继续错误解读其输出。

  3. 缺少验证循环:最核心的问题在于缺乏“先写后读”的验证步骤。在发出更改文件系统的命令之后,智能体应当先执行读取操作(如 ls 或 dir)以确认变更如预期正确发生。但 Gemini 并没有这样的保障行为,它默认自己的操作输出没有问题。

 

我已经在 gemini-cli GitHub repo 上提交了这个问题(https://github.com/google-gemini/gemini-cli/issues/4586),而且下决心花钱订阅 Claude 了。相较于意外删除自己的文件,我很乐意为更靠谱的 AI 花点钱。

 

原文链接:

https://anuraag2601.github.io/gemini_cli_disaster.html

https://news.ycombinator.com/item?id=44651485

2025-07-25 12:001

评论

发布
暂无评论

Hyperf结合PhpOffice/PhpSpreadsheet实现Excel&CSV文件导出导入

Owen Zhang

php hyperf php扩展 PhpOffice/PhpSpreadsheet

发挥好数字人民币促“双碳”作用

CECBC

抢占先机!为何说区块链通证经济象征未来?

CECBC

阿里云何川:开放兼容的云,计算巢帮助合作伙伴云化升级

阿里云弹性计算

弹性计算 年度峰会 计算巢

C语言-函数的可变形参(不定形参)

DS小龙哥

C语言

在Windows上运行Rainbond,10分钟快速安装

北京好雨科技有限公司

C语言-语句(if,for,while,switch,goto,return,break,continue)

DS小龙哥

C语言

C语言-数组

DS小龙哥

C语言

从内存管理原理,窥探OS内存管理机制

华为云开发者联盟

cpu 内存 内存管理 应用程序 OS

区块链,元宇宙时代的“基础设施”

CECBC

最佳实践:青藤云安全发布国内首个K8S ATT&CK攻防矩阵

青藤云安全

企业管理系统可视化权限功能设计

雯雯写代码

可视化 权限 企业管理系统

详解数据中台的底层架构逻辑

五分钟学大数据

数据中台 数据仓库 1月月更

在Mac上运行Rainbond,10分钟快速安装

北京好雨科技有限公司

C语言-函数的定义、声明、传参

DS小龙哥

C语言

2021关键词:重新起航

faiting

数据结构算法 盘点 2021

新能力让数据多端协同更便捷,数据跨端迁移更高效!|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

大搜车面向复杂业务场景的研发运维体系治理实践

阿里云弹性计算

弹性计算 运维峰会 研发运维

Ubuntu LNMPR环境搭建(Ubuntu 20.04 + Nginx1.8 + PHP 7.3 + Mysql8.0 + Redis5.0)

Owen Zhang

ubuntu LNMPR

Golang:定时器的终止与重置

恒生LIGHT云社区

golang 定时器 语言 Go 语言

评委拍案叫绝、项目惊喜不断,这是一届怎样的 Hackathon ?丨TiDB Hackathon 2021 回顾

PingCAP

缓存一致性最佳实践

得物技术

缓存 分布式 数据 一致性 实践

微服务分布式架构中,如何实现日志链路跟踪

华为云开发者联盟

微服务 日志 分布式架构 logback 链路跟踪

Hadoop中mapreduce作业日志是如何生成的

华为云开发者联盟

hadoop hdfs mapreduce YARN 作业日志

深入解析Kafka的offset管理

编程江湖

kafka

『征文精选』技术翻译与术语管理技术:专业人说专业话

SphereEx

数据库 翻译 ShardingSphere 征文 SphereEx

跨平台技术实战!百度文库跨平台技术快速落地全过程

百度Geek说

跨平台 PC 百度文库

Java开发Redis面试题分享

@零度

redis Java 开发

城墙上的“云镜派”,如何守护云上资产安全?

白洞计划

Ubuntu 基于Nginx1.8的Golang环境搭建(Ubuntu 20.04 + Nginx1.8 + Golang 1.17 )

Owen Zhang

golang nginx ubuntu

C语言-基本数据类型与位运算

DS小龙哥

C语言

文件被 Gemini 当场“格式化”,全没了!网友控诉:Claude、Copilot 也爱删库,一个都跑不了_生成式 AI_Tina_InfoQ精选文章