如何在Linux下恢复已删除的文件?


65

偶然地,我使用rm了不想删除的文件。有什么方法可以在Linux下取回它吗?


@Nav rm是一个“危险的” UNIX / Linux命令(已阅读$ man rm)。使用时要格外小心。话虽如此,这是一种删除您确定的文件的快速方法。现代Linux和Unix桌面环境确实提供了“垃圾箱”解决方案,因此用户可以轻松地恢复意外删除的文件。
Jose Elera


如果您希望将来还原文件,请不要使用“ rm”。请改用“ rm-trash”实用程序: github.com/nateshmbhat/rm-trash
Natesh bhat

Answers:


51

以下是恢复文本文件的通用步骤。

  1. 首先使用wall命令告诉用户系统正在以单用户模式关闭:

    # wall
    System is going down to .... please save your work.
    

    按CTRL + D发送消息。

  2. 接下来,使用init 1命令使系统进入单用户模式:

    # init 1
    
  3. 使用grep(传统UNIX方式)恢复文件

    使用以下grep语法:

    grep -b 'search-text' /dev/partition > file.txt
    

    要么

    grep -a -B[size before] -A[size after] 'text' /dev/[your_partition] > file.txt
    

    哪里,

    -i : Ignore case distinctions in both the PATTERN and the input files i.e. match both uppercase and lowercase character.
    -a : Process a binary file as if it were text
    -B Print number lines/size of leading context before matching lines.
    -A: Print number lines/size of trailing context after matching lines.
    

    要恢复/ dev / sda1上以“ nixCraft”字开头的文本文件,可以尝试以下命令:

    # grep -i -a -B10 -A100 'nixCraft' /dev/sda1 > file.txt
    
  4. 接下来使用vi查看file.txt。

    仅当删除的文件是文本文件时,此方法才有用。如果您正在使用ext2文件系统,请尝试使用restore命令。

可在http://www.cyberciti.biz/tips/linuxunix-recover-deleted-files.html找到


16
值得一提的是,单用户模式
无法

1
此方法对文本文件有效,谢谢!我喜欢它的原因是它不依赖文件系统的日志(例如extundelete),但实际上是扫描整个驱动器的原始字节。如果此命令找不到您的文件,则不会。
本杰明·B。

1
@Quinma,此方法仅需稍作修改即可远程工作...除了运行之外init 1,请手动杀死除之外的所有系统守护程序sshd。我还认为,此时您应该重新安装所有文件系统RO并保存到tmpfs(假设您的临时文件适合ram),以避免用临时数据覆盖文件。在稍后将它们重新装入RW之后,您当然必须稍后将其复制到其他位置,或者复制到远程服务器,或者复制回到本地文件系统。
Thomas Guyot-Sionnest,2015年

什么是your_partition ???我有错误:/ dev / sda1:没有这样的文件或目录
coolcool1994 '16

1
@Qback,我真的不知道。如前所述,我只是逐步进行。但是init 1是用于管理任务的,它可能会杀死与该运行级别场景无关的进程。这可能有助于防止硬盘被使用,并覆盖您要恢复的文件。
加布里埃尔·奥利维拉

13
  • 如果这非常重要,请从计算机中取出磁盘,然后聘请一家公司为您服务。
  • 如果仅是非常重要,请以只读方式安装磁盘,使用将整个分区复制到文件,dd然后尝试在其中找到文件(使用grep或编辑器)。

编辑:有时ddrescue比效果更好dd


1
“试图在其中查找文件”我很困惑,一个人如何合理地打开一个15 GB以上的文件,然后将这头野兽搜索或通过管道传输到grep?找到文字后您会怎么做?这种复苏到底如何?
TheLQ'7

1
首先要做的是尝试一些通用工具,然后再花费大量现金以获取不确定的结果。顺便说一句,grep并不会真正帮助,photorec或ext3grep会帮助。
wazoox 2010年



5
  • 唯一正确的答案是:从备份还原文件。每个人都必须有一个备份。对于真正重要的文件,您应该有两个备份。你不是吗 好吧,太糟糕了,这是一个教训。(很抱歉,听起来很刺耳,但是我在数据存储中,人们不会备份,直到他们丢失了一些重要数据,这是既定的事实。是的,您看起来很愚蠢,但是几乎所有人都是如此)。

  • 好的,您没有备份。您必须停止使用包含文件RIGHT NOW的文件系统。任何写操作都可以肯定限制可能(仅可能)保留在磁盘上的文件数据。

  • 如果您发生悲剧性错误,即仅将一个分区用作根文件系统和/ home,则意味着您必须从其他设备引导。现在

  • 如果您的文件具有某些常用格式(Word文件,JPG等),请使用Photorec。Photorec可以检索最常见的文件格式。

  • 您可以尝试先前提出的“ ext3 undelete”方法,但是您需要熟悉命令行,了解基本的Linux内部工作原理等。

  • 如果您的文件具有某些特殊格式,请祝您好运。我曾经写过一个Perl程序来扫描驱动器中的一些特殊文件,并且效果很好。但是您需要了解一些编程知识才能做到这一点,并且对Linux也很放心。


5

我是几年前做的。我的方法是直接,没有时间浪费,卸载分区,然后

dd if=/dev/hda1 of=backup_image.ext3

具有分区确切状态的备份文件。然后,您可以再次挂载该分区,然后在创建的映像中搜索已删除的文件时照常进行操作。由于您需要所有“空”空间,因此图像可能会非常大,因此存储它可能是一个实际的问题。

然后,只是在我希望将文本片段放在分区内容的某个位置之后,才进行无聊的搜索。例如找到.tex文件,我跑了

grep --binary-files=text -1000 "subsection" < backup_image.ext3 > latexfiles

它在短语“ subsection”周围打印了一个较大的上下文,并将输出保存到文件中以供手动搜索。我打印了一个很大的上下文,因为搜索图像花了很长时间,所以我宁愿不要这样做。

该命令strings还有助于从输出中删除二进制垃圾,但是如果我没有记错的话,它也会删除所有换行符,这可能是一个问题。

要以相同的方式查找二进制文件,可能会成功找到特征性标头或某个文件的某些内容,但是我认为这是一个很大的冒险。


简要技术说明:磁盘恢复和Ext3 / 4存在技术困难。要解释很长,但是要简短(且不够充分):Ext3 / 4删除了“标记”,这些标记告诉操作系统删除文件时文件在磁盘上的位置。这些文件不会被擦除,但是没人知道它们在磁盘上的开始和结束位置,有时它们甚至会分散在多个位置。其他一些文件系统只是将文件状态设置为“已删除”,但保留位置数据。然后,取消删除并不比使用带有该标志的文件指针难(如果没有发生过多的活动,它们应该仍然可用),然后希望它们的内容不会被覆盖。

什么是最好的?在我看来,修辞。频繁备份是解决所有这些问题的方法。恕我直言,没有自动备份系统的重要数据是意外事件。


强制性个人轶事:我要删除foo\ foo*~。我写

rm -r foo<Tab>*

,可悲的是,由于它foo显然是一个符号链接,并且是唯一与此匹配的文件,因此将shell制成了

rm -r foo\ foo *

我按Enter键并坐在那里看命令,该命令最多应该花一秒钟。过了一会rm儿,我问我是否要“删除受写保护的文件'东西'”。我很快就感到发抖,我轻柔地控制着自己Ctrl+c。〜我的一半~被删除了,但是我设法通过上述grepping和一些或多或少的当前备份恢复了所有有价值的东西。我个人有一些非常有价值(读:很耗时),磁盘上的最新测量数据丢失了,但是我做了四倍的备份。一个人在这里失散,另一个人由于学校系统故障而损坏,另一个人损坏了,起初我找不到第四个,因为我错误地将其放在错误的文件夹中:-D。没有rm -r卡在一个受写保护的文件上,因为该文件夹是通过my中的sshfs挂载的,所以它已经被吃掉了~。从那以后,我对这种东西更加谨慎。


5

如果这是标准的rm,希望您有一个备份。如果可以,恢复已删除文件的过程对于每个文件系统将有所不同。Linux没有内置的“回收站”。删除文件后,一切就消失了。

无论采取哪种方式,您都希望拔出计算机的电源,请尽快拔下电源,因为继续运行计算机(甚至将其关闭)会导致对磁盘的写入,并增加了以前由磁盘占用的某些块的机会。文件将被覆盖。完成此操作后,可以将其放入另一台计算机中,重新启动活动CD(确保除非以只读方式安装驱动器,否则请不要安装该驱动器),或者卸下硬盘驱动器并将其带给数据恢复专家。


4

放低您的期望。如果在“已删除”数据上写入了任何内容,您将丢失它。

我做了少量的恢复,发现的最好的工具通常是针对某些格式设计的。例如,当我想恢复成千上万的jpeg时,“ photorec”就很棒。

Recuva之前也对我有所帮助,可能是您最好的选择。(它是免费的,不要被他们的广告欺骗)

归根结底,如果丢失的内容很重要,请使驱动器脱机并停止对其进行写入。使用您可以找到的所有恢复软件,直到您取回数据或不再值得使用为止。如果确实很重要,请以高价将其发送给专业人士。

如果您以前有过使用该工具的运气,请根据自己的熟悉程度再试一次。归根结底,它们不应该写入磁盘,因此可以使用软件,直到找到可行的软件为止。


2

这是一份适合您的好文件。您将在此处找到大量实用技巧。

顺便说一句,有两类人:

  1. 那些做备份的人
  2. 那些会备份的人

恭喜,您刚刚晋升为第2组。;-)


2

如果您打开的应用程序当前正在读取文件,例如VLC或LibreOffice,那么L&U.SO的出色回答将使我摆脱困境。这是执行此操作的另一种方法

通常的想法是在其中找到链接/proc/PID/fd/DESCRIPTOR_NUMBER并将其复制回其原始位置。使用ps aux | grep APP_NAME查找PID,然后ls -la /proc/PID/fd/找到合适的DESCRIPTOR_NUMBER。


1

“正确”的答案是假设没有一种方法可以可靠地恢复,而是从备份或克隆的系统还原或重新安装。

TestDisk是一个很棒的工具,还有其他方法可以根据文件系统和删除的近期性从物理驱动器中挽救一些数据,但是所涉及的时间和痛苦可能会太大,因此请保持备份(并进行测试)。它们有效且可恢复)!


1

如果没有被其他用户覆盖,那么您很幸运。我不小心删除了cpp源文件,并使用了名为foremost的工具,该工具帮助我从磁盘上恢复了60G cpp碎片。最后,我通过逐块组装这些碎片来恢复文件。我认为它会扫描特定文件类型的特定模式,并遍历磁盘上的所有inode以恢复文件!试试看!


0

如果您不小心从Linux删除了该文件,则可以使用以下命令:

find /root -name "search text" -type f  -exec mv {} "/home" \;

在地方search text,你可以把文件名和要在地方的恢复可以指定目录/home


2
嗨,桑托什。请不要在您的帖子中添加误导性链接。它已被删除。
2014年

0

您可以尝试此脚本。效果很好,并且打算现在代替rm和im广泛使用它。

https://github.com/nateshmbhat/safe-rm

特征 :

  • 旨在代替rm
  • 处理rm可以接受的所有参数
  • 处理文件名与垃圾箱中已有文件的冲突
  • 自动处理一些权限问题
  • 如果从任何其他脚本或间接调用rm,则系统会自动使用“ rm”命令
  • 显示适当的错误消息,如出现在 rm

-2

上周我遇到了同样的问题,我尝试了很多程序,例如debugfs,photorec,ext3grep和extundelete。ext3grep是恢复文件的最佳程序。sintax非常简单:

ext3grep image.img --restore-all

要么:

ext3grep /dev/sda3 --restore-all --after date -d '2015-01-01 00:00:00' '+%s' --before `date -d ‘2015-01-02 00:00:00’ ‘+%s’

该视频显示了可以帮助您的迷你教程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.