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


28

怎样做dd if=somefile bs=1 skip=1337 count=31337000,但是有效地而不是不使用1字节的读取和写入?

该解决方案有望:

  1. 简单(对于非简单我可以编写一些Perl oneliner来实现)
  2. 为了支持较大的偏移量和长度(因此,dd块大小的黑客将无济于事)

部分解决方案(不够简单,尝试用length进行相同操作会使其更加复杂):

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

您是否要更改dd使用的块大小?
cmorse 2012年

已更改的块大小=>已更改的跳过和计数单位
Vi。

Answers:


37

这应该做到这一点(在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搜索的第一个Google搜索结果之一,所以我希望能用新的更新来进行更新特征。


2

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

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

第二个dd可以读取您认为有效的任何块大小的输入。请注意,这需要产生一个额外的过程。根据您的操作系统而定,这会产生一定的成本,但它可能比必须读取一个字节的文件要小(除非您的文件非常小,在这种情况下不会有问题)。


对于较大的偏移量和数量,它是否可以很好地工作(即不要占用太多内存)?dd if=/dev/sda bs=10000000001 | dd bs=255 count=1 | hd->“ dd:无效数字'10000000001'”
六。

@Vi。如果要跳过较大的偏移量,则应按照一系列“理想”(取决于源)大小的块(16M)进行初始读取,然后删除一系列较小的块(512),这些块将在内存中,以“放大”数据,然后放下不适合块大小的奇数部分(下面的bs = 1),然后读取所需的块。例如,您想从偏移量10000000001中读取255个字节: dd if=/dev/sda bs=16M skip=596 count=1 | dd bs=512 skip=1522 count=1 | (dd bs=1 count=1 of=/dev/null ; dd bs=255 count=1)
RolKau'2

肯定会更容易read -n跳过吗?然后head -c算?例如,cat somefile | (read -n 1337; head -c 31337000)您也可以在不产生额外流程的情况下做到这一点:exec 3<somefile; read -n 1337 -u 3; head -c 31337000 <&3
Gannet 2015年

1

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


2
然后它将从偏移量1337 * 4096而不是1337
Vi中

1
啊哈,我明白了,那么它可能会更容易在这个例子中写一个简单的Python脚本,例如像stackoverflow.com/questions/1035340/...f.seek(1337)使用前read(MY_CHUNK_SIZE)
ccpizza

感觉最可靠的方法可能是编写自定义可执行文件。有些系统没有Python,Ruby,甚至Perl。:|
Trejkaz

1

您可以尝试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 #

这与以十六进制查看文件无关。这是关于从指定偏移量(以字节为单位)中提取文件的内容(例如,将其复制到某处)。
六。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.