我需要分割的文件是32GB。
我需要按照我指定的偏移量将文件分成两部分,并且只需要保留第二部分。
我可以通过以下方式轻松做到这一点:
dd if=binary_file.bin of=second_part.bin bs=1 skip=143254
然而,这需要很长时间(小时)才能完成,我需要一个可以更快完成该过程的命令行方法。
有什么建议么?
我正在使用 OS X 10.11.6(El Capitan)。
答案1
我来这里寻找同样的东西,经过进一步的研究,发现了几件事:
bs
1. dd (coreutils) 具有为、skip
和指定不同单位的标志count
。其中skip
和count
必须以字节为单位或与bs
值匹配。
这是通过使用iflag
参数 andskip_bytes
和/或来完成的count_bytes
。
对于你的情况,如下所示:
dd if=binary_file.bin of=second_part.bin bs=4M skip=143254 iflag=skip_bytes
2. 如果dd
MacOS 用户无法使用 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 内部缓冲区)。
- 跳至您想要开始阅读的部分。(bs=1 skip=143254)
- 从 143254 读取到 143254,bs=1,count=3990
- 使用 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