给定:一个通用二进制文件和一个块大小
期望输出:二进制文件的副本,其中所有仅包含零位/字节的块都已从文件中删除/剥离
我真的很想知道为什么我找不到一个可以完成这个简单工作的工具。我创建了一个小脚本,但它的性能太差了。一定有一个现有的软件可以做到这一点,不是吗?!
也许找到这个问题是由于有太多术语可以用来表达这种需求造成的......
编辑:您提到的 sed 线程会替换每个字节,如果一行中至少有许多块大小,我只想替换 0 字节。
我想研究一个非常大的非常稀疏的文件(不是文件系统中的稀疏文件那样的稀疏),并且为了进行分析,我想删除不相关的部分
编辑 2:文件大小在 10 到 1000 GB 之间。对于小文件,我自己的慢速工具还可以,但对于这么大的文件...
答案1
bbe
是“一个sed
类似于二进制文件的编辑器”。在 Debian 中,它位于bbe
软件包中。
最好能s/^\0*$//
识别出充满空字节的块并删除它们。我的测试表明,这种类似正则表达式的表达式在 中不起作用。您仍然可以使用(几乎)尽可能bbe
多的表达式:\0
s/\0\0…\0\0//
其中…
表示正确的子字符串数量\0
。如果您选择较大的块大小,则通过命令行传递相应长的字符串可能会有问题。幸运的是,bbe
支持从文件读取脚本。继续如下:
# The following function uses non-POSIX 'for' loop. Rewrite if necessary.
gen_script() {
printf 's/'
for ((i=0;i<"$1";i++)); do
printf '\\0'
done
printf '//\n'
}
# This needs to be a plain decimal number:
blocksize=512
gen_script "$blocksize" > bbe-script
<binary_file_in bbe -b ":$blocksize" -f bbe-script >binary_file_out
问题:
- 上述的实现
gen_script
相当慢,对于较大的来说相当不切实际blocksize
。 - 在我的测试中,超过这个值时(即 16 KiB 的块)
bbe
就会出现错误。这使得第一个问题变得无关紧要。blocksize
16384
在这个角色
bbe
本身似乎也不是很快。我不知道你的“非常大的文件”有多大。如果我是你,我会尝试pv binary_file_in | bbe -b ":$blocksize" -f bbe-script >binary_file_out
几秒钟后我就能判断 ETA 是否可以接受。