除了使用dd
截断、查找和跳过功能来读写文件之外,还应该使用哪些工具?dd
的命令行选项似乎不方便且陌生,我不喜欢在缓慢但精确的搜索模式(bs=1
)和快速但不灵活的模式(bs=4k
或其他模式)之间进行选择。
是否有更现代的工具可以从位置 31337 处的一个文件(或管道或套接字或 dev)读取 555 字节,并将它们写入位置 128205 处的另一个文件(使用块 512+43),有或没有截断?
答案1
有一个工具ddrescue
(注意,还有一个dd_rescue
具有几乎相同功能的不同程序)。它使用更熟悉的语法,单破折号表示短选项,双破折号表示长选项。从手册页:
-i, --input-position=<bytes>
starting position in input file [0]
-K, --skip-size=<bytes>
initial size to skip on read error [64 KiB]
-M, --retrim
mark all failed blocks as non-trimmed
-o, --output-position=<bytes>
starting position in output file [ipos]
答案2
dcfldd是另一种 dd 替代方案。它没有解决OP关于输入/输出寻求灵活性的问题,但可能对通过谷歌搜索到达这里的其他人有用。
它基于 gnu dd,具有以下附加功能:
- 即时散列 - dcfldd 可以在传输输入数据时对其进行散列,有助于确保数据完整性。
- 状态输出 - dcfldd 可以根据传输的数据量和操作需要多长时间向用户更新其进度。
- 灵活的磁盘擦除 - 如果需要,dcfldd 可用于快速擦除磁盘并使用已知模式。
- 图像/擦除验证 - dcfldd 可以验证目标驱动器是否与指定的输入文件或模式逐位匹配。
- 多个输出 - dcfldd 可以同时输出到多个文件或磁盘。
- 分割输出 - dcfldd 可以将输出分割为多个文件,并且比 split 命令具有更多的可配置性。
- 管道输出和日志 - dcfldd 可以将其所有日志数据和输出发送到本机命令和文件。
答案3
一个好的替代方案是pv
.它不仅会自动计算最有效的块大小,从本质上加快速度,而且还提供进展等。它的使用很简单:
pv < /dev/sda > sda.img
它在压缩方面也表现良好。一次性备份和压缩磁盘的一种快速方法如下:
pv < /dev/sdb | pigz -9 > disk.img.gz
您可以了解更多这里。
答案4
实际上,您可以使用 dd 管道来完成此操作,而不会降低性能,不会出现截断或舍入错误,并且具有字节级精度:
dd iflag=skip_bytes,count_bytes skip=1234 count=42 | dd oflag=seek_bytes conv=notrunc seek=12340 of=test.bin
在左侧,dd 将跳过前 1234 个字节并准确读取 42 个字节。它将通过高效的扇区缓冲和对齐来执行。将在偏移量 1234 处读取 42 个字节,没有舍入错误。在右侧,dd 将在输出上精确查找 12340 个字节,并仅写入从管道接收到的 42 个字节。它将通过高效的扇区缓冲和对齐来执行。在管道中,两个 dd 实例将以扇区大小的块发送和接收数据,以获得良好的性能,除了正确处理的最后几个字节之外。
请注意,count_bytes 没有 oflag,因此需要此管道!
下面是一个尝试仅计算 2 个字节但没有管道的示例。请注意,额外的数据在输入上消耗并写入输出:
$ printf aaa | dd oflag=seek_bytes conv=notrunc seek=0 count=2 | xxd
0+1 records in
0+1 records out
00000000: 6161 61 aaa
3 bytes copied, 0.000158916 s, 18.9 kB/s