Belirtilen uzaklıktan dosya çıktısı alın, ancak “dd bs = 1 skip = N” değil mi?


28

Nasıl bir şey yapmak dd if=somefile bs=1 skip=1337 count=31337000, ama verimli bir şekilde, 1-byte okuma ve yazma kullanmamak?

Çözüm bekleniyor:

  1. Basit olmak için (basit olmayanlar için bunu yapacak bir Perl oneliner yazabilirim)
  2. Büyük ofsetleri ve uzunlukları desteklemek için (bu nedenle gd cinsinden blok boyutuna sahip kesmek yardımcı olmaz)

Kısmi çözüm (yeterince basit değil, aynı uzunlukta çalışmak, onu daha da karmaşık hale getirecek):

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'nin kullandığı blok boyutunu değiştirmeye mi çalışıyorsunuz?
Ocak'ta cmorse

Değişen blok boyutu => atlama ve sayma için birimler değiştirildi
Vi.

Yanıtlar:


37

Bunu yapmalı (gnu dd'de):

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

Siz de kullanıyorsanız seek=, düşünebilirsiniz oflag=seek_bytes.

Kimden 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: Bu sorunun eski olduğunu ve soru asıl sorulduktan sonra bu bayrakların uygulandığı anlaşılıyor, ancak yaptığım ilgili bir dd araması için ilk google sonuçlarından biri olduğu için, yeni bir güncelleme yapmak güzel olurdu. özellik.


2

Tüm ilk baytları hendeklemek için bir işlem, daha sonra gerçek baytları okumak için bir saniye kullanın, örneğin:

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

İkincisi dd, verimli bulduğunuz blok boyutu ile girişi okuyabilir. Bunun ortaya çıkması için fazladan bir işlem yapılması gerektiğini unutmayın; işletim sisteminize bağlı olarak, maliyeti artacaktır, ancak muhtemelen dosyaları tek tek bayt okumak zorunda kalmaktan daha küçüktür (çok küçük bir dosyanız yoksa, bu durumda bir sorun olmaz).


Büyük ofsetler ve sayımlar için iyi çalışacak mı (yani çok fazla bellek tutma) mı? dd if=/dev/sda bs=10000000001 | dd bs=255 count=1 | hd-> "dd: geçersiz sayı 10000000001 '"
Vi.

@Vi. Çok büyük bir ofset atlamak istiyorsanız, ilk okumayı "ideal" bir dizi (kaynağınıza bağlı olarak) boyutlu bloklar (16M) olarak yapmalı ve ardından bellekte olacak olan daha küçük boyutlu blokları (512) bırakmalısınız. , blok boyutuna uymayan tek bir bölümü bırakmadan önce (bs = 1) verilerinizi "yakınlaştırmak" ve ardından istediğiniz bloğu okumak için. Örneğin, ofset 10000000001'den 255 bayt okumak istiyorsanız: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

Kesinlikle read -natlamak için kullanmak daha kolay olurdu ? Ve sonra head -csaymak için? Örn cat somefile | (read -n 1337; head -c 31337000): Ekstra bir süreç oluşturmadan bunu yapabilirsiniz:exec 3<somefile; read -n 1337 -u 3; head -c 31337000 <&3
Gannet

1

Yerine bs=1kullanılması bs=4096ya da daha fazla.


2
Daha sonra 1337
Vi

1
Aha, görüyorum ki, basit bir Python betiği yazmak muhtemelen daha kolay olacaktır, örneğin bu örnekte olduğu gibi - ile kullanmadan önce stackoverflow.com/questions/1035340/…f.seek(1337)read(MY_CHUNK_SIZE)
19.03

En güvenilir yöntem muhtemelen özel bir çalıştırılabilir dosya yazmaktır. Bazı sistemlerde Python, Ruby, hatta Perl yoktur. : |
Trejkaz 24/18

1

Hexdump komutunu deneyebilirsiniz:

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

Sadece içeriği görmek istiyorsanız:

#/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 #

Dosyayı hex olarak görüntülemekle ilgili değil. Bir dosyanın içeriğini (örneğin, bir yere kopyalamak için) belirtilen uzaklıktan bayt cinsinden çıkarmakla ilgilidir.
Vi.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.