读取文件末尾以恢复数据

Mat*_*ord 12 data-recovery

一个非常旧的 .swp 文件还原了我正在编辑的文件,因此它现在明显更短。从那以后我没有在那个目录中做任何事情,所以紧跟在文件末尾的字节应该仍然有我的数据。我可以使用什么函数从给定的内存地址读取 N 个字节?ddread在文件边界处停止,除非我错过了某个选项。

当前文件大小为 3.2 KB。我不记得文件被截断之前到底有多大,但可能不超过 10 KB。如何从文件开头读取 10 KB,忽略文件边界?数据保存不完美也没关系,只要我不用从头开始。

fro*_*utz 18

通常编辑器在保存文件时,删除或截断为0,从而释放分配的空间,然后写入,分配新的空间。这导致文件系统将数据放在完全不同的物理位置。所以你的想法可能行不通。

您可以使用filefrag或获取文件的物理位置hdparm --fibmap,然后使用dd直接读取该物理位置。我已经在不同的上下文中描述了这个过程:https : //unix.stackexchange.com/a/85880/30851


在您的情况下,您更有可能需要查找文本数据的一般方法......例如:

strings -n 12 -t d /dev/partition | grep -F 'text snippet'
Run Code Online (Sandbox Code Playgroud)

strings 将寻找连续的 ASCII 数据(也支持一些其他编码,不确定 UTF-8。如果它是代码或英语,你将不需要它),它还会打印找到的偏移量。

text snippet应该是一个准确的、独特的文本样本,你记得在你正在寻找的文件的一部分[在一行中]。(如果您不完全了解,则可以使用正则表达式进行 grep。)

-n 12strings要查找的最小长度。12应该是你的text snippet. 此参数是可选的,如果提供它可能有助于strings | grep加快速度。

读取整个分区需要很长时间,但如果成功,您将有一个偏移量,您可以提供给它dd以抓取一般区域,然后删除不属于的内容。

从那以后我没有在那个目录中做任何事情

如果您的目录不是挂载点...大多数文件系统并没有真正为“每个目录”保留空间,所以...整个文件系统中的任何和所有写入都可能覆盖您正在寻找的位。在数据恢复情况下,您通常会将整个事物切换为只读模式。

  • 谢谢一堆。文件末尾只有垃圾,但是使用`strings` 我能够在分区的其他地方找到整个文件。这几乎是我不需要完成的两个月的工作,这是一个很好的提醒,始终对任何重要的事情使用版本控制。 (4认同)
  • 恰恰相反,您必须非常不走运才能找到碎片化的 10KB 文件。如果您只找到一部分,则在这种情况下,另一部分更有可能被覆盖。但是,除非您在该文件系统中有大量写入活动,或者它是具有即时丢弃功能的 SSD,否则如果您在编辑时多次保存该文件,您可能会发现该文件的许多副本。 (3认同)
  • 我建议使用 `strings -n16` 或一些合理的最小长度,以使其更快。 (3认同)