Bagaimana melakukan sesuatu seperti dd if=somefile bs=1 skip=1337 count=31337000
, tetapi efisien, tidak menggunakan tidak membaca dan menulis 1-byte?
Solusinya diharapkan:
- Sederhananya (untuk non-sederhana saya dapat menulis beberapa Perl oneliner yang akan melakukan ini)
- Untuk mendukung offset dan panjang yang besar (jadi peretasan dengan ukuran blok di dd tidak akan membantu)
Solusi parsial (tidak cukup sederhana, mencoba yang sama dengan panjang akan membuatnya lebih kompleks):
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
Jawaban:
Ini harus dilakukan (pada gnu dd):
Jika Anda menggunakan
seek=
juga, Anda juga dapat mempertimbangkanoflag=seek_bytes
.Dari
info dd
:P: Saya mengerti pertanyaan ini sudah tua dan sepertinya bendera ini diterapkan setelah pertanyaan awalnya diajukan, tetapi karena ini adalah salah satu hasil google pertama untuk pencarian dd terkait yang saya lakukan, saya pikir akan lebih baik untuk memperbarui dengan yang baru fitur.
sumber
Gunakan satu proses untuk membuang semua byte awal, lalu satu detik untuk membaca byte aktual, misalnya:
Yang kedua
dd
dapat membaca input dengan ukuran blok apa pun yang Anda rasa efisien. Perhatikan bahwa ini membutuhkan proses ekstra untuk melahirkan; tergantung pada OS Anda yang akan dikenakan biaya, tetapi mungkin lebih kecil daripada harus membaca file satu per satu byte (kecuali jika Anda memiliki file yang sangat kecil, dalam hal ini tidak akan ada masalah).sumber
dd if=/dev/sda bs=10000000001 | dd bs=255 count=1 | hd
-> "dd: angka tidak valid` 10000000001 '"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)
read -n
untuk melompat? Laluhead -c
menghitung? Misalnyacat somefile | (read -n 1337; head -c 31337000)
Atau Anda bisa melakukannya tanpa melahirkan proses tambahan:exec 3<somefile; read -n 1337 -u 3; head -c 31337000 <&3
Alih-alih
bs=1
menggunakanbs=4096
atau lebih.sumber
f.seek(1337)
sebelum menggunakanread(MY_CHUNK_SIZE)
Anda dapat mencoba perintah hexdump:
Jika Anda hanya ingin melihat isinya:
sumber