一个非常旧的 .swp 文件恢复了我正在编辑的文件,因此它现在明显更短。从那以后我没有在该目录中执行任何操作,因此紧随文件末尾的字节应该仍然包含我的数据。我可以使用什么函数从给定的内存地址读取 N 个字节?dd
并read
在文件边界处停止,除非我错过了某个地方的选项。
当前文件大小为 3.2 KB。我不记得文件被截断之前有多大,但可能不超过 10 KB。如何从文件开头读取 10 KB,忽略文件边界?如果数据没有完美保存也没关系,只要我不必从头开始。
答案1
通常,当编辑者保存文件时,他们会删除或截断为 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 12
strings
是要寻找的最小长度。12
应该是你的长度text snippet
。此参数是可选的,如果提供它可能有助于strings | grep
加快速度。
读取整个分区将花费很长时间,但如果成功,您将获得一个偏移量,您可以将其提供给以dd
获取一般区域,然后删除不属于的内容。
从那以后我没有在该目录中执行任何操作
如果您的目录碰巧不是挂载点...大多数文件系统并没有真正为“每个目录”保留空间,因此...整个文件系统中的任何和所有写入都可能会覆盖您正在查找的位。在数据恢复情况下,您通常会将整个事物切换为只读模式。