2010-06-08 02:00:57 +0000 2010-06-08 02:00:57 +0000
65
65

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

不小心,我在一个不想删除的文件上使用了rm,怎么恢复?有什么方法可以让我在Linux下恢复它吗?

答案 (15)

51
51
51
2010-06-08 02:04:42 +0000

以下是恢复文本文件的一般步骤。

  1. 首先使用 wall 命令告诉用户系统进入单用户模式:

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

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

  4. 接下来使用vi命令查看file.txt。

发现在http://www.cyberciti.biz/tips/linuxunix-recover-deleted-files.html

13
13
13
2010-07-09 06:27:42 +0000
  • 如果是非常重要的,把磁盘从电脑里拿出来,请公司帮你做。
  • 如果只是非常重要,把磁盘挂载到只读,用dd把整个分区复制到一个文件里,然后试着在其中找到文件(用grep,或者用编辑器)。
9
9
9
2010-07-09 06:29:12 +0000

如果你的文件系统是 ext3 ,请使用 ext3grep

8
8
8
2010-06-08 03:33:59 +0000
5
5
5
2011-07-25 01:23:05 +0000

几年前我也是这样做的。我的做法是直接,没有时间损失,卸载分区,然后

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

有一个备份文件的确切状态的分区。然后你可以再次挂载分区,然后继续像往常一样在你创建的镜像中寻找被删除的文件。这个镜像可能会非常大,因为你需要所有的 “空 "空间,所以存储它可能是一个实际问题。

然后就是在我预期的分区内容的汤的某处的文本片段后进行无聊的搜索。例如,为了查找.tex-files,我运行了

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

,它打印了一个大的上下文,围绕着 "subsection "这个短语,并将输出保存到一个文件中,以便手动搜索。我打印了这么大的上下文,因为搜索图像要花很长时间,所以我宁愿不要多做几次。

另外,strings命令对清除输出中的二进制垃圾很有帮助,但如果我没记错的话,它也会把所有的换行符都去掉,这可能是个问题。

要用同样的方法找到二进制文件,可能会成功找到某个文件的特征头之类的东西,但我想象这是个相当大的冒险。


简要技术说明:磁盘恢复和Ext3/4有技术上的困难。说来话长,简单(也不充分)解释一下。Ext3/4删除了 "标记",当你删除文件时,它会告诉操作系统文件在磁盘上的位置。这些文件没有被擦除,但没有人知道它们在磁盘上的起始和结束的位置了,有时甚至会在几个地方被分割成碎片。还有一些文件系统只是将文件的状态设置为 "已删除",但保留了位置数据。那么撤消删除也不难,比起看一下有这个标志的文件指针(如果不是发生了太多的活动,它们应该还是可以的),然后希望它们的内容没有被覆盖,

什么最好?修辞,在我看来。经常备份是解决这些问题的答案。重要的数据如果没有自动化的备份系统,那就是等待事故的发生,IMHO。


强制性的个人轶事。我本来想从foo\ foo*中删除~。我写了

rm -r foo<Tab>*

,很可悲的是,由于foo显然是一个symlink,而且是唯一匹配的文件,所以shell做成了

rm -r foo\ foo *

,我按了回车键,坐在那里看着命令,最多只需要一秒钟。又过了一会儿,rm问我是否要 "删除受写保护的文件'某事’",我很快就感觉到了寒意,轻轻地很有控制地按下了Ctrl+c。~我的~被删除了一半,但我通过上面描述的grepping和一些或多或少的当前备份,成功地找回了所有有价值的东西。我有一些个人非常有价值(读:耗时)和最近的测量数据在磁盘上丢失了,但我做了四次备份。一个在这里消失了,另一个由于在学校的系统中断,另一个是损坏的,起初我无法找到第四个,因为我错误地把它放在错误的文件夹:-D . 如果不是rm -r卡在了一个写保护的文件上,第四个文件夹就会被吃掉,因为我的~中的那个文件夹是通过sshfs挂载的。从那以后,我对这种事情就更加小心了。

5
5
5
2010-07-09 13:41:50 +0000
  • 唯一正确答案是:从备份中恢复文件。每个人都必须有一个备份。对于真正重要的文件,你应该有两个备份。你没有吗?好吧,太糟糕了,这里有一个教训(抱歉,我是做数据存储的,但我是做数据存储的,人们在丢失一些重要的数据之前是不会备份的,这是既定的事实。所以是的,你看起来很蠢,但几乎所有人都是如此)。

  • OK,你没有备份。任何写入活动都可能会影响到磁盘上的文件数据。

  • 如果你只使用一个分区作为根文件系统和/home,那意味着你必须从其他设备启动。**

  • 如果你的文件是一些常见的格式(Word文件、JPG等),请使用Photorec

  • 你可以尝试之前提出的 “ext3 undelete "方法,但你需要熟悉命令行,了解基本的linux内部工作原理等等。我曾经写过一个Perl程序来扫描驱动器中的一些特殊文件,效果很好,但你需要懂一些编程,而且对linux也很熟悉。

5
5
5
2010-07-09 06:37:16 +0000

如果是标准的 rm ,希望你有备份。如果可以的话,恢复被删除的文件的过程在每个文件系统中都是不同的,如果可以的话。Linux没有内置的 “回收站";一旦你删除了一个文件,它就会消失。

无论你用什么方法,你都要尽快拔掉电脑的插头,因为继续运行电脑(甚至关机)会导致写入磁盘,并增加了一些以前被文件占用的块被覆盖的可能性。一旦你完成了这一点,要么把它放在另一台电脑上,从活光盘中重新启动(确保不要挂载驱动器,除非你把它挂载成只读),或者把硬盘驱动器拿去找数据恢复专家。

4
4
4
2011-04-19 07:59:56 +0000

把你的期望值定得很低。

我做过少量的恢复工作,我发现最好的工具往往是针对某些格式设计的。例如,'photorec'是伟大的,当我想恢复数以万计的jpegs。(它是免费的,不要被他们的广告骗去付费)

在一天结束时,如果你丢失的东西是重要的,就把硬盘脱机并停止写入它。使用每一块你能找到的恢复软件,直到你得到你的数据回来或它停止是值得的。如果它真的很重要,那就高价送去找专业人员。

如果你以前用过一个工具,看到你熟悉了,就再试一次。在一天结束时,他们不应该写到磁盘上,所以你可以使用软件,直到你找到一个有效的软件。

2
2
2
2014-05-24 20:43:18 +0000

如果你当前打开的应用程序正在读取文件,比如VLC或LibreOffice,那么这个很好的L&U.SO答案就帮我摆脱了这个困境。下面是另一种方法的做法。

一般的思路是找到/proc/PID/fd/DESCRIPTOR_NUMBER中的链接,然后复制回原来的位置。用ps aux | grep APP_NAME找到PID,然后用ls -la /proc/PID/fd/找到合适的DESCRIPTOR_NUMBER。

1
1
1
2018-07-09 18:57:14 +0000

如果没有被其他用户覆盖,那你就很幸运了。我不小心删除了我的cpp源文件,用了一个叫foremost的工具,帮我从磁盘上恢复了60G的cpp碎片。最后,我把那些碎片一块一块地组装起来,终于恢复了我的文件。我认为它可以扫描特定的文件类型的特定模式,并遍历磁盘上所有的inode来恢复文件! 试试就好了!

1
1
1
2011-07-24 15:23:23 +0000
1
1
1
2013-07-30 07:55:30 +0000

这里有一个很好的【文档】(https://help.ubuntu.com/community/DataRecovery)。你会发现有很多实用的技巧。

BTW,这里有两类人:

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

恭喜你,你刚刚晋升为第二组。)

0
0
0
2014-07-17 12:52:30 +0000

如果你不小心从Linux中删除了文件,那么你可以使用这个命令:

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

代替search text,你可以把文件名和你要恢复的目录指定为/home

0
0
0
2018-05-15 01:46:17 +0000

你可以试试这个脚本。效果很好,可以代替rm使用,我现在正在广泛使用。 https://github. com/nateshmbhat/safe-rm

特点 :

  • 用来代替 rm
  • 处理所有 rm 可以接受的参数
  • 处理文件名与垃圾箱中的文件碰撞
  • 自动处理一些权限问题
  • 如果 rm 被其他脚本或间接调用,系统的 ‘rm’ 命令会自动使用
  • 显示相应的错误信息,就像在 rm 中出现的那些错误信息一样。
-2
-2
-2
2015-10-19 12:27:52 +0000

上周我也遇到了同样的问题,试了很多程序,比如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’

本视频显示的是一个小教程,可以帮助你。