如何从指定的偏移量输出文件,而不是“dd bs=1 skip=N”?

如何从指定的偏移量输出文件,而不是“dd bs=1 skip=N”?

如何做类似的事情dd if=somefile bs=1 skip=1337 count=31337000,但有效,不使用 1 字节的读写?

预期解决方案是:

  1. 为了简单(为了不简单,我可以写一些 Perl 单行代码来实现这一点)
  2. 支持较大的偏移量和长度(因此 dd 中的块大小修改无济于事)

部分解决方案(不够简单,尝试相同的长度将使其变得更加复杂):

dd if=somefile bs=1000 skip=1 count=31337 | { dd bs=337 count=1 of=/dev/null; rest_of_pipeline; }
# 1337 div 1000 and 1337 mod 1000

答案1

这应该可以做到(在 gnu dd 上):

dd if=somefile bs=4096 skip=1337 count=31337000 iflag=skip_bytes,count_bytes

如果您seek=也在使用,那么您也可以考虑oflag=seek_bytes

info dd

`count_bytes'
      Interpret the `count=' operand as a byte count, rather than a
      block count, which allows specifying a length that is not a
      multiple of the I/O block size.  This flag can be used only
      with `iflag'.

`skip_bytes'
      Interpret the `skip=' operand as a byte count, rather than a
      block count, which allows specifying an offset that is not a
      multiple of the I/O block size.  This flag can be used only
      with `iflag'.

`seek_bytes'
      Interpret the `seek=' operand as a byte count, rather than a
      block count, which allows specifying an offset that is not a
      multiple of the I/O block size.  This flag can be used only
      with `oflag'.

附言:我知道这个问题已经很老了,而且这些标志似乎是在问题最初被提出之后实现的,但是因为它是我进行的有关 dd 搜索的第一个谷歌搜索结果之一,所以我觉得用新功能进行更新会很好。


注意:此答案仅适用于GNU dd,被大多数 Linux 发行版使用,它是GNU coreutils 包,此功能是在 coreutils 版本 8.16 中引入的(2012-03-26,即原始问题得到解答几个月后)。

注意Mac 用户:MacOS 使用基于 bsd 的 unix 实用程序变体(主要是出于许可原因),但 GNU 版本的 unix 实用程序通常开发更为活跃,并且通常具有更多功能。您可以使用以下方式在 Mac 上安装 GNU coreutils自制brew install coreutils

答案2

使用一个进程抛弃所有初始字节,然后使用第二个进程读取实际字节,例如:

echo Hello, World\! | ( dd of=/dev/null bs=7 count=1 ; dd bs=5 count=1 )

第二个dd可以使用您认为有效的任何块大小来读取输入。请注意,这需要生成一个额外的进程;具体取决于您的操作系统,这将产生成本,但它可能比逐个字节读取文件要小(除非您的文件非常小,在这种情况下不会有问题)。

答案3

而不是bs=1使用bs=4096或更多。

答案4

您可以尝试 hexdump 命令:

hexdump  -v <File Path> -c -n <No of bytes to read> -s <Start Offset>

如果你只是想看看内容:

#/usr/bin/hexdump -v -C mycorefile -n 100 -s 100
00000064 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000074 00 00 00 00 01 00 00 00 05 00 00 00 00 10 03 00 |................| 
00000084 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 |......@.........| 
00000094 00 00 00 00 00 00 00 00 00 00 00 00 00 a0 03 00 |................| 
000000a4 00 00 00 00 00 10 00 00 00 00 00 00 01 00 00 00 |................| 
000000b4 06 00 00 00 00 10 03 00 00 00 00 00 00 90 63 00 |..............c.| 
000000c4 00 00 00 00 |....| 
000000c8 #

相关内容