在文件中快速查找大量零的方法

在文件中快速查找大量零的方法

我最近部分恢复了 2.5TB 的故障磁盘。ddrescue创建了一个映像,我可以以环回模式安装它,恢复了 2.1TB,丢失了 450GB,不幸的是分散在整个磁盘上。

要查看哪些文件受到了影响,我可以使用filefrag -v并查看由生成的地图文件ddrescue

但那会花很长时间。我发现,由于我恢复的只是视频文件,所以不会出现大片的零,但在ddrescue没有从磁盘读取数据的地方,它们确实存在。

因此,如果文件中有(任意)大块全零,我需要一个命令来扫描文件。实际上,这些总是 512 字节的倍数,并且总是从 512 字节地址开始。是否有命令可以扫描文件中的此类二进制字节序列(即 512×'\0')?

答案1

我已经修改了xenoid 的回答具体来说对于空字节,基于另一个问题的答案关于如何 grep 空字节:

grep -Pal '\x00{512}' the_files

答案2

我无法明确地查找grep空字符。但是,让它查找 512 个连续的相同字符(这几乎是不可能的)要简单一些:

grep -Eal '(.)\1{511}' the_files

列出找到 512 个相同字符序列的文件。该-a参数是必需的,以使其匹配空字符(否则它们将被视为行尾字符并被忽略)。

答案3

xenoid 的回答可能会快速找到受影响的文件。要确认并进一步分析,您可以运行:

<"file" tr '\000-\377' 'oL' | fold -w 512 | grep -vn 'L' | cut -f 1 -d ':'

其工作原理如下:

  1. "file"已打开并流式传输至第一个命令。
  2. tr将每个空字符转换为o,将每个非空字符转换为L
  3. fold每 512 个字符后插入一个换行符。此时该流可以作为纯文本处理。
  4. grep取出不包含的行L并将其与编号一起打印。
  5. cut隔离这些数字(清除ooo…)。

这样,您就会得到以零填充的 512 字节块的序数。编号以 开头1。将输出传递给 以wc -l查看给定文件中有多少块受到影响。

答案4

我对此很感兴趣,因为这是我偶尔想要的东西,于是我做了一些搜索,想出了这个 Python 3 程序

我执行了wget页面底部的命令,它运行完美(不过sudo,根据您的权限,您可能需要)。与 一样grep,它有许多强大的选项,包括正则表达式搜索:标题中的示例显示了其中的一些;bgrep --help给出了完整列表。

为了您的使用,您将需要一个包含 512 个双零的运行字符串:不要输入它们,而是使用类似以下内容:

bgrep -l $(for f in {0..511}; do echo -n 00; done) files...

您可能想要使用该-r选项来遍历完整的目录树。

我添加了这个答案,并不是因为其他答案不够充分(我特别喜欢 Kamil Maciorowski 的命令序列的独创性),而是因为它可能对遇到此问题并遇到相关问题的其他人员(像我一样)有价值。

相关内容