介绍
我不小心做了一件可怕的事。我键入ls
而不是cd
,然后rm -rf
在我当前的目录上运行了一些命令,而不是几天前的该目录的副本,该副本出现在mnt
我编写的脚本没有达到我的预期效果之后。
我知道这里已经有类似的问题,但没有一个是全面的。我想借此“机会”开始一系列公共贡献的答案,以供将来其他人参考。
例如,有关于使用photorec
和 的建议testdisk
。这些可能不是最好的解决方案。我找到了另一个答案,这里,建议使用locate
.我对此一无所知,也不知道它是如何运作的。
我的系统
我的系统是 Debian 10 系统,跟踪测试分支。数据存储在 SSD 上,格式为 ext4。当我意识到我跑rm -rf
错地方时,我按住电脑上的电源按钮将其关闭。
解决步骤
我有另一台笔记本电脑运行另一个 Debian 系统。我已将 SSD 从计算机中取出,并将其插入外部 USB 转 Sata 接口。
我相信我现在需要以某种方式安装它,这意味着系统无法将数据写入设备。我该怎么做?
然后我可以使用此locate
方法(链接问题)来取回数据吗?在执行任何操作之前,我想确保这是正确的做法。
数据重要吗?
是的 - 我删除的目录包含我的博士学位的所有代码。我还有几周时间。我有一个可以使用的旧版本,然后重新实现我在过去几周左右所做的所有事情。然而在那短短的时间内我改变了很多东西。本周我的研究取得了“突破”。代码的编写方式意味着重新实现它一点也不简单。
我有备份吗? (编辑)
我唯一确定的是我拥有的服务器上有日期2 May 2020
。从那时起我已经完成了大量的工作,因为我几乎全天候工作。
那里可能是此 SSD 上的其他备份,但其中一些备份位于我的主目录中 - 因此这些备份将被rm -rf
删除,并且备份脚本未按我的预期工作 - 因此可能不存在其中的常规备份。 (试图删除正在复制的奇怪内容就是我最终陷入困境的原因。)
目前我无法访问SSD来检查日期。我需要知道如何安装它以使数据无法写入其中(如果可能的话)。
如果我只有 5 月 2 日的那些,那就真的很糟糕了。我最近在这方面疯狂地工作了几个小时,这可能就是为什么我今天早上醒来不小心把它搞砸了。
答案1
以下是需要考虑的一些事项:
首先进行完整的磁盘复制:
dd if=/dev/sdX of=image.img bs=1M status=progress
处理此副本(例如photorec image.img
)而不是磁盘本身。根据我的(长期)经验,比许多文件类型
foremost
更好。photorec
根据您的文件类型,您可能想要考虑向 中添加自定义文件头foremost
,这在过去对我来说非常有效。我的回答中有更多关于最重要/photorec 的内容这里这我的答案可能会帮助您从恢复的干草堆中找到可用的文件。
请勿安装 SSD。正如评论中已经指出的,安装只读可能并不总是足以防止覆盖。处理
dd
图像。
现在,这是我不久前学到的一个(令人兴奋的)技巧,它可能实际上对你有用。
我删除的目录包含我的博士学位的所有代码
所以这是文字。现在,如果您的大部分代码都在一个(或几个)文件中,您实际上可以尝试以下操作:
grep -ai '<this text is in my newest code revision>' image.img
我知道这听起来太简单了,但它之前在同样的情况下救了我。您可能需要添加-C x
到命令中以包含x
(替换为数字)匹配行上方和下方的行。
请注意,您的文件可能部分损坏。尝试多种模式。从很多单词开始尝试找到完全匹配的单词,如果没有结果,请尝试更少的单词。
还有强制性的...始终进行备份。不在同一驱动器上。验证备份。您正在处理文本,我认为这不是数百GB,因此您也可以设置云备份(当然是加密的)或类似的东西。
另一条建议是:不要花更多的时间在这上面,而不是重写代码。保持冷静,尝试你能做的,看看我的grep
方法是否对你有帮助,如果你在一整天后没有得到任何结果,最好的解决方案可能是获取最新的备份并从那里再次工作。
答案2
答案的开始
我使用实用程序套件photorec
来testdisk
恢复一些数据。
我尝试过的事情清单
- 启动 Debian 10 笔记本电脑(独立机器)
- 通过 USB 将 SSD 插入 SATA 控制器(坏主意!)
- 磁盘自动安装(不知道如何防止这种情况)
- 开始使用dd复制数据进行备份
- 空间不足
- 已取消 dd 作业
- 首先 dd 复制数据可能是个好主意,但不知道该怎么做
- 我遇到的问题:磁盘大小为 1TB,我需要在检查之前复制所有 1TB(可能?我可以忽略归零块吗?)
photorec
- 内置 SSD(笔记本电脑)仅为 500 GB
- 连接外部 4TB 驱动器
- 未安装的 1TB SSD(我正在尝试从中恢复)
- 没有打扰 dd
- 已加载
photorec
- 此处的说明:https://www.cgsecurity.org/wiki/PhotoRec_Step_By_Step
- 我所做的唯一不同的是更改它搜索的文件类型,将它们全部关闭并仅搜索
.tx?
相关.txt
选项(其中包括 .c 源文件等)
数据处理
- Photorec 生成了数百个输出文件夹和数千个文件
- 我不明白文件名或目录名的命名/编号约定
- 文件名全是乱七八糟的废话
- 用于
grep -rIw
在子文件夹中搜索完全匹配的整个单词字符串 - 使用 bash 脚本对输出进行一些处理以删除不相关的行
- 用于
diff
比较结果匹配 - 找到我的源文件之一的最新版本
- 还有几个要去...
概括
不确定这是否应该是“接受的答案” - 但上面的方法是我用来检索文件的方法。
这不是一个特别好的方法,但很有效。
对于丢失的数据是图像的情况,通过浏览内容或查看缩略图来找到正确的文件可能要容易得多。
文本文件更难处理,因为系统会由于系统生成的文本文件、日志等而产生许多误报。
答案3
如果你关闭电源的速度足够快,那么在对分区进行完整的二进制备份之后,你可以给扩展删除尝试一下。
如果我没记错的话,extundelete 利用分区上的日志来“撤消”由rm -rf
.