一个非常旧的 .swp 文件还原了我正在编辑的文件,因此它现在明显更短。从那以后我没有在那个目录中做任何事情,所以紧跟在文件末尾的字节应该仍然有我的数据。我可以使用什么函数从给定的内存地址读取 N 个字节?dd
并read
在文件边界处停止,除非我错过了某个选项。
当前文件大小为 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 12
是strings
要查找的最小长度。12
应该是你的text snippet
. 此参数是可选的,如果提供它可能有助于strings | grep
加快速度。
读取整个分区需要很长时间,但如果成功,您将有一个偏移量,您可以提供给它dd
以抓取一般区域,然后删除不属于的内容。
从那以后我没有在那个目录中做任何事情
如果您的目录不是挂载点...大多数文件系统并没有真正为“每个目录”保留空间,所以...整个文件系统中的任何和所有写入都可能覆盖您正在寻找的位。在数据恢复情况下,您通常会将整个事物切换为只读模式。