我最近部分恢复了 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 ':'
其工作原理如下:
"file"
已打开并流式传输至第一个命令。tr
将每个空字符转换为o
,将每个非空字符转换为L
。fold
每 512 个字符后插入一个换行符。此时该流可以作为纯文本处理。grep
取出不包含的行L
并将其与编号一起打印。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 的命令序列的独创性),而是因为它可能对遇到此问题并遇到相关问题的其他人员(像我一样)有价值。