快速按偏移量分割二进制文件

快速按偏移量分割二进制文件

我需要分割的文件是32GB。

我需要按照我指定的偏移量将文件分成两部分,并且只需要保留第二部分。

我可以通过以下方式轻松做到这一点:

dd if=binary_file.bin of=second_part.bin bs=1 skip=143254

然而,这需要很长时间(小时)才能完成,我需要一个可以更快完成该过程的命令行方法。

有什么建议么?

我正在使用 OS X 10.11.6(El Capitan)。

答案1

我来这里寻找同样的东西,经过进一步的研究,发现了几件事:

bs1. dd (coreutils) 具有为、skip和指定不同单位的标志count。其中skipcount必须以字节为单位或与bs值匹配。

来源

这是通过使用iflag参数 andskip_bytes和/或来完成的count_bytes
对于你的情况,如下所示:

dd if=binary_file.bin of=second_part.bin bs=4M skip=143254 iflag=skip_bytes
2. 如果ddMacOS 用户无法使用 coreutils,您也可以使用两个不同的dd命令并通过管道传输它们。

来源

像这样:

dd if=binary_file.bin bs=143254 skip=1 | dd bs=4M count=1 > second_part.bin

或者更好的是跳过第二个步骤dd并直接将输出传输到文件:

dd if=binary_file.bin bs=143254 skip=1 > second_part.bin

但我已在较小的文件上测试过所有这些,并且根据文件大小,可能会占用较多的内存。

答案2

也许读取几个字节直到 4k 边界,然后用第二个命令附加其余部分?

假设我们想要以 4K 边界结束(大多数文件系统似乎使用 4K 内部缓冲区)。

  1. 跳至您想要开始阅读的部分。(bs=1 skip=143254)
  2. 从 143254 读取到 143254,bs=1,count=3990
  3. 使用 bs=4k 读取文件的其余部分并将其附加到输出文件。(参见如何通过 dd 将数据附加到文件中在 SU 上)

如果这太慢并且你将其编写为重复性任务,你甚至可以通过对前 3584 个字节(7*512)进行 512b 读取,然后进行 400 个单字节读取,其余部分为 4k 大小来进一步优化。

请注意,这个答案感觉像是一种解决方法。我很乐意阅读这个问题将吸引的其他答案。甚至可能是一个干净的解决方案,它只是寻找 143254,然后使用正常的读/写操作进行复制,允许使用文件系统默认值,而不是我对 4k 内部缓冲区的明确假设。

答案3

不确定 OS X,但我认为这应该可行:

filesize=$(wc -c <"binary_file.bin")

tail -c $(($filesize-143254)) binary_file.bin > second_part.bin

或者你可以这样做(需要+1,因为在我看来这个值的尾部的解释很奇怪):

tail -c +$((143254+1)) binary_file.bin > second_part.bin

相关内容