如何以合理的速度复制二进制文件的任意部分?
显然,dd
withbs=1
非常慢,而设置bs
为另一个值则无法复制任意部分。
这是错的吗?可以用 做吗dd
?如果不是的话,那么工具是什么?
例如,这个命令,
dd if="$img" of=tail.bin bs=2147483648 skip=1 status=progress
Run Code Online (Sandbox Code Playgroud)
复制错误的尾部。
而这个命令,
dd if="$img" of=tail.bin bs=1 skip=2147483648 status=progress
Run Code Online (Sandbox Code Playgroud)
非常慢。
fro*_*utz 21
GNU dd 支持count_bytes
, seek_bytes
,skip_bytes
标志。这允许您使用具有任意偏移和大小的高性能块大小选择。
如果您指定字节单位,GNU dd 自版本 9.1 起默认执行此操作。
如果块计数以“B”结尾,dd 现在计算字节而不是块。例如,“dd count=100KiB”现在复制 100 KiB 数据,而不是 102,400 个数据块。因此,标志 count_bytes、skip_bytes 和eek_bytes 已过时并且不再记录,尽管它们仍然有效。
另一种选择是创建具有所需偏移和尺寸限制的循环设备。这适用于本身不支持任意偏移的 dd (或任何其他程序)。
或者,您也可以考虑仅复制 bs=1 的部分第一个/最后一个块以及具有所需较大块大小的中间段。
尝试这个:
tail -c +$FROM file.dat | head -c $LENGTH > file1.dat
Run Code Online (Sandbox Code Playgroud)
只需根据需要分配 FROM 和 LENGTH 即可。请注意, 的编号tail
是基于1 的,例如tail -c +4
表示从第四个字节开始,即跳过前三个字节。
举个例子:
$ printf 'abcdefghijklmnopqrstuvwxyz\n' > test.txt
$ tail -c +4 test.txt | head -c 6; echo
defghi
Run Code Online (Sandbox Code Playgroud)