写点什么

文件被 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:008148

评论

发布
暂无评论

2023-05-06:X轴上有一些机器人和工厂。给你一个整数数组robot,其中robot[i]是第i个机器人的位置 再给你一个二维整数数组factory,其中 factory[j] = [posit

福大大架构师每日一题

golang rust 福大大

Django笔记二十二之多数据库操作

Hunter熊

Python django database

一套前后台全部开源的H5商城送给大家

越长大越悲伤

开源 java‘

Mac 触控增强神器:BetterTouchTool如何使用?

Rose

苹果软件下载 BetterTouchTool破解 BetterTouchTool教程 Mac 触控增强神器

Go常用设计模式(下)

闫同学

三周年连更

Focus Matrix for Mac(智能任务管理器)

Rose

mac软件下载 Focus Matrix 任务管理器

软件测试 | MTV开发模式

测吧(北京)科技有限公司

测试

Java实现坦克大战2.0

timerring

Java

Golang中如何使用Singleflight库进行并发请求合并

Jack

【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的Redis延时队列的功能组件

码界西柚

redis 分布式 延时队列 redisson 三周年连更

Redis桌面管理用什么工具好?

真大的脸盆

Mac Mac 软件 桌面管理工具

Go常用设计模式(中)

闫同学

三周年连更

Pratt Parsing - 自顶向下的算符优先级

乌龟哥哥

三周年连更

macOS硬盘如何格式转换?用Tuxera NTFS就够了!

Rose

ntfs FAT32

苹果Mac最佳卸载程序和清理助手:App Cleaner & Uninstaller

Rose

mac系统清理优化软件 苹果系统清理 App Cleaner

什么是人工智能领域模型的 Presence Penalty 参数?

汪子熙

人工智能 机器学习 深度学习 强化学习 三周年连更

深入理解 TypeScript 的 type 以及 type 与 interface 和 class 的区别

Lee Chen

typescript

Java IO流详解

timerring

Java

站点可靠性工程SRE最佳实践 -- 黄金监控信号

俞凡

SRE

云原生文件存储 CFS 线性扩展到千亿级文件数,百度沧海·存储论文被 EuroSys 2023 录用

Baidu AICLOUD

文件存储 元数据 posix

云原生应用使用的云服务组件介绍

穿过生命散发芬芳

三周年连更 云服务组件

架构训练营模块一作业

Geek_3d7c4d

架构训练营

Office Mac升级提醒如何去掉?关闭Microsoft AutoUpdate弹框提示

Rose

许可证 Office 2019中文版 Office Mac office更新 office2021下载

Macos媒体播放器 Movist Pro 针对 macOS 13 Ventura 进行了优化

Rose

Movist Pro 中文版 Movist Pro下载 Macos媒体播放器 视频播放器下载

必知必会的JavaScript前端面试题篇(一),不看后悔!

Immerse

面对“失业焦虑”我们可以做些什么?让 AI 帮助自己变得更强大! | 社区征文

汪子熙

人工智能 机器学习 程序员 ChatGPT 三周年征文

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