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

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

如何做類似的事情dd if=somefile bs=1 skip=1337 count=31337000,但有效,不使用非 1 位元組讀取和寫入?

預計解決方案:

  1. 為了簡單起見(對於不簡單,我可以寫一些 Perl oneliner 來做到這一點)
  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'.

Ps:我知道這個問題很舊,似乎這些標誌是在最初提出問題後實現的,但由於這是我所做的相關 dd 搜索的第一個谷歌結果之一,我認為用新的更新會很好特徵。


注意:此答案僅適用於GNU dd,被大多數 Linux 發行版使用,它是GNU coreutils 包,此功能是在 coreutils 版本 8.16 上引入的(2012-03-26,在回答原始問題幾個月後)。

注意事項蘋果電腦用戶: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 #

相關內容