读取文件末尾以恢复数据


12

一个非常旧的.swp文件还原了我正在编辑的文件,因此现在大大缩短了。此后,我在该目录中未做任何事情,因此紧接文件末尾的字节仍应包含我的数据。我可以使用什么功能从给定的内存地址读取N个字节?ddread停止在文件边界,除非我错过了某个地方的选项。

当前文件大小为3.2 KB。我不记得文件被截断之前到底有多大,但可能不超过10 KB。我如何从文件开头读取10 KB,而忽略文件边界?只要我不必从头开始,就可以很好地保存数据,这是很好的。

Answers:


18

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

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


在您的情况下,您更有可能需要用于查找文本数据的通用方法……例如:

strings -n 12 -t d /dev/partition | grep -F 'text snippet'

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

text snippet应该是一个精确的,唯一的文本示例,您记得该文件位于要查找的文件的一部分中(单行)。(如果您不太清楚,则可以使用正则表达式进行grep代替。)

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

读取整个分区将花费很长时间,但如果成功,您将获得一个偏移量,可以dd获取以获取常规区域,然后删除不属于该区域的内容。

自该目录以来,我没有做任何事情

如果您的目录不是碰巧是挂载点,那么大多数文件系统实际上都不会“按目录”保留空间,因此...整个文件系统中的所有写入都可能会覆盖您要查找的位。在数据恢复情况下,通常会将整个对象切换为只读模式。


请注意,每个文件都存储在许多块中,它们通常不连续存储。因此strings,除非您非常幸运,否则将仅定位文件的某些部分。
吉尔(Gilles)'所以

3
相反,找到碎片化的10KB文件必须非常不幸。如果仅找到一部分,则在这种情况下另一部分更有可能被覆盖。但是,除非您在该文件系统中有大量写活动,或者它是具有立即丢弃功能的SSD,否则如果在编辑时多次保存该文件,则可能会找到该文件的许多副本。
弗罗斯特斯

3
我建议strings -n16或使用一些合理的最小长度,以使其运行更快。
彼得·科德斯

好点,将其添加到答案中。
弗罗斯特斯2013年

4
谢谢你 文件末尾只有垃圾,但是有了这个文件,strings我就可以在分区的其他地方找到整个文件。这几乎是我两个月不必做的工作,这是一个很好的提醒,始终将版本控制用于任何重要的事情。
马修·贝德福德
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.