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

Hai*_*ang 69 linux rm file-recovery

偶然地,我使用rm了一个我不想删除的文件。有什么方法可以让我在 Linux 下恢复它?

Gab*_*ira 53

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

  1. 首先使用 wall 命令告诉用户系统在单用户模式下宕机:

    # wall
    System is going down to .... please save your work.
    
    Run Code Online (Sandbox Code Playgroud)

    按 CTRL+D 发送消息。

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

    # init 1
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用 grep(传统的 UNIX 方式)恢复文件

    使用以下 grep 语法:

    grep -b 'search-text' /dev/partition > file.txt
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    grep -a -B[size before] -A[size after] 'text' /dev/[your_partition] > file.txt
    
    Run Code Online (Sandbox Code Playgroud)

    在哪里,

    -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.
    
    Run Code Online (Sandbox Code Playgroud)

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

    # grep -i -a -B10 -A100 'nixCraft' /dev/sda1 > file.txt
    
    Run Code Online (Sandbox Code Playgroud)
  4. 接下来使用 vi 查看 file.txt。

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

位于http://www.cyberciti.biz/tips/linuxunix-recover-deleted-files.html

  • 值得注意的是你不能远程执行这个单用户模式关闭网络 (17认同)

Sjo*_*erd 13

  • 如果这非常非常重要,请从计算机中取出磁盘并聘请公司为您完成。
  • 如果只是非常重要,请以只读方式挂载磁盘,使用 将整个分区复制到文件中dd并尝试在其中查找文件(使用grep或编辑器)。

编辑:有时ddrescuedd.


小智 9

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


Jam*_*s T 8

Testdisk有一个可以在 Linux 上使用的取消删除选项。

一个适用于 Linux 的演练。请注意,它适用于ext2ext3ext4


Dan*_*son 6

几年前我这样做了。我的做法是直接,不耽误时间,卸载分区然后

dd if=/dev/hda1 of=backup_image.ext3
Run Code Online (Sandbox Code Playgroud)

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

然后它只是在文本片段之后执行无聊的搜索,我希望在分区内容的某个地方。例如,为了找到 .tex 文件,我跑了

grep --binary-files=text -1000 "subsection" < backup_image.ext3 > latexfiles
Run Code Online (Sandbox Code Playgroud)

它在短语“subsection”周围打印了一个大上下文,并将输出保存到一个文件中以供手动搜索。我打印了如此大的上下文,因为搜索图像需要很长时间,我宁愿不做比不得不做的更多次。

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

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


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

什么是最好的?修辞,在我看来。频繁备份是所有这些问题的答案。恕我直言,没有自动备份系统的重要数据是等待发生的事故。


强制性的个人轶事:我打算foo\ foo*~. 我写

rm -r foo<Tab>*
Run Code Online (Sandbox Code Playgroud)

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

rm -r foo\ foo *
Run Code Online (Sandbox Code Playgroud)

我按下 Enter 并坐在那里看着命令,这最多应该花费一秒钟。过了一会儿,rm问我是否要“删除写保护的文件‘某物’”。很快我就感觉到了寒意,我轻轻地、非常自控地按下了Ctrl+c。~我的一半~被删除了,但我设法通过上述 grepping 和一些或多或少的当前备份恢复了所有有价值的东西。我在磁盘上丢失了一些个人非常有价值(阅读:耗时)和最近的测量数据,但我做了四重备份。一个在这里消失了,另一个是由于学校系统中断,另一个是损坏的,起初我找不到第四个,因为我错误地把它放在了错误的文件夹中 :-D 。没有rm -r卡在一个写保护的文件上,第四个会被吃掉,因为该文件夹是通过 sshfs 挂载到我的~. 从那以后,我对那种东西更加小心了。


cHa*_*Hao 5

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

不管你怎么做,你都希望尽快拔掉计算机,因为继续运行计算机(甚至关闭它)会导致写入磁盘并增加以前被磁盘占用的某些块的机会文件将被覆盖。完成此操作后,将其放入另一台计算机,重新启动Live CD(确保不要安装驱动器,除非将其安装为只读),或者卸下硬盘驱动器并将其交给数据恢复专家。


waz*_*oox 5

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

  • 好吧,你没有备份。你必须停止使用含有该文件的文件系统现在。任何写入活动肯定会占用可能(仅可能)保留在磁盘上的文件数据。

  • 如果你犯了一个悲剧性的错误,只使用一个分区作为根文件系统和 /home,那意味着你必须从其他设备启动。现在

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

  • 您可以尝试之前提出的“ext3 取消删除”方法,但您需要熟悉命令行,了解基本的 linux 内部工作原理等。

  • 如果您的文件是某种特殊格式,那么运气不好。我曾经写过一个 Perl 程序来扫描驱动器中的一些特殊文件,它运行得很好;但是你需要知道一些编程才能做到这一点,并且对 linux 也很自在。