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

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

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

答案1

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

  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 文件系统,请尝试使用恢复命令。

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

答案2

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

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

答案3

如果您的文件系统扩展, 使用ext3grep

答案4

几年前我这样做过。我的方法是直接卸载分区,然后

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卡在写保护的文件上,第四个文件就会被吃掉,因为那个文件夹是通过 sshfs 挂载在我的 中的~。从那以后,我对这类事情更加小心了。

相关内容