Gunakan `dd` untuk memotong bagian akhir file

18

Mungkin ada trik sederhana untuk melakukan ini, tetapi saya tidak dapat menemukan dari halaman manual.

Bagaimana cara saya memotong 1MB terakhir dari file dengan ukuran yang tidak ditentukan misalnya, dengan menggunakan dd?

zetah
sumber
1
Anda ingin salinan file itu, kecuali untuk 1MB terakhir, atau Anda ingin MB terakhir disalin ke file lain?
Mat
Saya ingin 1MB terakhir
zetah

Jawaban:

29

Nah, anggap Anda sudah statdan bash, Anda bisa mendapatkan ukuran file dengan:

stat -c %s your_file

Jika Anda ingin mengekstrak $amountbyte terakhir untuk file itu dd, Anda bisa:

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

Tetapi pendekatan yang lebih waras adalah menggunakan tail:

tail -c $(( 1024*1024 )) your_file > target_file
Tikar
sumber
Tidak ada -copsi untuk head?
ADTC
Saya pikir maksudnya + $ ((1024 * 1024)): -c, --bytes = K menampilkan byte K terakhir; sebagai alternatif, gunakan -c + K untuk menghasilkan byte yang dimulai dengan Kth dari setiap file
Vanuan
5
dd --help
Penggunaan: dd [operan] ...
  atau: dd OPSI
Menyalin file, mengonversi, dan memformat sesuai dengan operan.

  bs = BYTES membaca dan menulis byte BYTES pada satu waktu (juga lihat ibs =, obs =)
  cbs = BYTES mengonversi byte BYTES pada satu waktu
  conv = CONVS mengonversi file sesuai daftar simbol yang dipisahkan koma
  count = BLOCKS hanya menyalin blok input BLOCKS
  ibs = BYTES membaca byte BYTES pada suatu waktu (default: 512)
  if = FILE baca dari FILE daripada stdin
  iflag = FLAGS dibaca sesuai daftar simbol yang dipisahkan koma
  obs = BYTES menulis byte BYTES pada suatu waktu (default: 512)
  dari = FILE tulis ke FILE bukan stdout
  oflag = BENDERA tulis sesuai daftar simbol yang dipisahkan koma
  seek = BLOCKS melewati BLOCKS blok berukuran obs pada awal output
  skip = BLOCKS skip BLOCKS blok berukuran ibs pada awal input
  status = noxfer menekan statistik transfer

BLOK dan BANTUAN dapat diikuti oleh sufiks multiplikatif berikut:
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, dan seterusnya untuk T, P, E, Z, Y.

Jika ukuran file tepat 10MB, 1024 * 10 10240K Ini akan meninggalkan 1024K terakhir. Anda harus menentukan ukuran blok yang Anda gunakan dengan menggunakan opsi ibs dan obs.

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

Anda juga dapat melewati 1MB file pertama, menggunakan opsi lewati untuk membaca hingga akhir file melompati 1MB pertama.

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

Dengan menggunakan opsi pencarian, Anda dapat menulis a ke tempat tertentu di file output Anda. Katakanlah Anda ingin menyimpan 1MB pertama dan lebih dari menulis 8MB terakhir.

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

Anda mungkin perlu mendapatkan beberapa detail tentang ukuran file Anda untuk memastikan Anda mendapatkan jumlah data yang masuk dan keluar yang tepat.

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

       --block-size = SIZE
              gunakan blok SIZE-byte. Lihat format SIZE di bawah ini

       -s, --ukuran
              cetak ukuran yang dialokasikan dari setiap file, dalam blok

       SIZE mungkin (atau mungkin bilangan bulat opsional diikuti oleh) salah satu dari
       rendah: KB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024, dan seterusnya untuk G, T,
       P, E, Z, Y.
nelaaro
sumber