有“dd”的替代品吗?

有“dd”的替代品吗?

除了使用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

相关内容