如何做類似的事情dd if=somefile bs=1 skip=1337 count=31337000
,但有效,不使用非 1 位元組讀取和寫入?
預計解決方案:
- 為了簡單起見(對於不簡單,我可以寫一些 Perl oneliner 來做到這一點)
- 支援大的偏移量和長度(因此在 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 #