Dosya son bölümünü kesmek için `dd` kullanın


18

Bunu yapmanın muhtemelen basit bir hilesi var, ama man sayfasından anlayamıyorum.

Örneğin kullanarak son 1 MB'yi belirsiz boyuttaki dosyadan nasıl kesebilirim dd?


1
Son 1 MB dışında o dosyanın bir kopyasını mı istiyorsunuz yoksa son MB'nin başka bir dosyaya mı kopyalanmasını istiyorsunuz?
Mat

Son 1MB istiyorum
zetah

Yanıtlar:


29

Eh, sahip olduğunuzu varsayarak statve bashdosya boyutunu şu şekilde alabilirsiniz:

stat -c %s your_file

Bu $amountdosyanın son baytını ile ayıklamak istiyorsanız dd, şunları yapabilirsiniz:

dd if=your_file of=extracted_part \
   bs=1 count=$amount \
   skip=$(( $(stat -c %s your_file) - $amount ))

Ancak akılcı yaklaşım tailşunları kullanmak olacaktır :

tail -c $(( 1024*1024 )) your_file > target_file

İçin -cseçenek yok headmu?
ADTC

Sanırım + $ ((1024 * 1024)) demekti: -c, --bytes = K son K bayt çıktısı; alternatif olarak, her dosyanın
Kth değeri

5
dd --help
Kullanım: dd [OPERAND] ...
  veya: gg SEÇENEK
İşlenenlere göre dönüştürerek ve biçimlendirerek bir dosyayı kopyalayın.

  bs = BYTES bir seferde BYTES bayt okuma ve yazma (ayrıca bkz. ibs =, obs =)
  cbs = BYTES bir seferde BYTES bayt dönüştürür
  conv = CONVS, virgülle ayrılmış simge listesine göre dosyayı dönüştürür
  count = BLOCKS yalnızca BLOCKS giriş bloklarını kopyala
  ibs = BYTES bir seferde BYTES bayt okuyor (varsayılan: 512)
  if = DOSYA stdin yerine FILE dosyasından okundu
  iflag = Virgülle ayrılmış sembol listesine göre okunan FLAGS
  obs = BYTES bir seferde BYTES bayt yazar (varsayılan: 512)
  of = FILE stdout yerine FILE yaz
  oflag = Virgülle ayrılmış sembol listesine göre FLAGS yazma
  seek = BLOCKS çıktı başlangıcındaki BLOCKS engel boyutundaki blokları atla
  skip = BLOCKS giriş başlangıcında BLOCKS ibs boyutlu blokları atla
  status = noxfer baskı transfer istatistikleri

BLOKLARI ve BYTES'i aşağıdaki çarpım ekleri izleyebilir:
c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M
GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024 vb. T, P, E, Z, Y için.

Dosya boyutu tam olarak 10MB ise, 1024 * 10 10240K Bu son 1024K'dan ayrılacaktır. İbs ve obs seçeneklerini kullanarak üzerinde çalıştığınız blok boyutunu belirtmelisiniz.

1M = 1024K 
1024*9 = 9216  
dd if=/10/MB/file of=/9/MB/file count=9216K ibs=1K obs=1K
dd if=/10/MB/file of=/9/MB/file count=9M ibs=1M obs=1M

Ayrıca, dosyanın ilk 1 MB'sini atlayarak dosyanın sonuna kadar okumak için atla seçeneğini kullanarak dosyanın ilk 1 MB'sini atlayabilirsiniz.

dd if=/10/MB/file of=/9/MB/file skip=1M ibs=1M obs=1M

Arama seçeneğini kullanarak çıktı dosyanızdaki belirli bir yere a yazabilirsiniz. İlk 1MB'yi korumak ve son 8MB'yi yazmak istediğinizi varsayalım.

dd if=/10/MB/file of=/9/MB/file skip=1M seek=1M count=8M ibs=1M obs=1M

Doğru miktarda veri girip çıkardığınızdan emin olmak için büyük olasılıkla dosya boyutunuz hakkında bazı ayrıntılar almanız gerekir.

ls -s --block-size 1K ./my/10MB/file
adam ls

       --block boyutlu = BOYUT
              SIZE baytlık bloklar kullanır. Aşağıdaki SIZE biçimine bakın

       -s, --size
              her bir dosyanın ayrılan boyutunu bloklar halinde yazdır

       SIZE fol‐dan biri olabilir (veya isteğe bağlı olarak bunu izleyen bir tam sayı olabilir)
       indirme: KB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024, vb. G, T,
       P, E, Z, Y.
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.