如何从文件中剥离/删除/剪切零字节/空字节

如何从文件中剥离/删除/剪切零字节/空字节

给定:一个通用二进制文件和一个块大小

期望输出:二进制文件的副本,其中所有仅包含零位/字节的块都已从文件中删除/剥离

我真的很想知道为什么我找不到一个可以完成这个简单工作的工具。我创建了一个小脚本,但它的性能太差了。一定有一个现有的软件可以做到这一点,不是吗?!

也许找到这个问题是由于有太多术语可以用来表达这种需求造成的......

编辑:您提到的 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

问题:

  1. 上述的实现gen_script相当慢,对于较大的来说相当不切实际blocksize
  2. 在我的测试中,超过这个值时(即 16 KiB 的块)bbe就会出现错误。这使得第一个问题变得无关紧要。blocksize16384
  3. 在这个角色bbe本身似乎也不是很快。我不知道你的“非常大的文件”有多大。如果我是你,我会尝试

    pv binary_file_in | bbe -b ":$blocksize" -f bbe-script >binary_file_out
    

    几秒钟后我就能判断 ETA 是否可以接受。

相关内容