Sử dụng `dd` để cắt phần cuối tập tin


18

Có lẽ có một mẹo đơn giản để làm điều này, nhưng tôi không thể tìm ra từ trang nam.

Làm cách nào để tôi cắt 1MB cuối cùng từ tệp với kích thước không xác định, chẳng hạn, bằng cách sử dụng dd?


1
Bạn muốn có một bản sao của tệp đó, ngoại trừ 1 MB cuối cùng, hoặc bạn muốn MB cuối cùng được sao chép sang một tệp khác?
Mat

Tôi muốn 1MB cuối cùng
zetah

Câu trả lời:


29

Chà, giả sử bạn có statbash, bạn có thể lấy kích thước tệp bằng:

stat -c %s your_file

Nếu bạn muốn trích xuất các $amountbyte cuối cùng cho tệp đó dd, bạn có thể:

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

Nhưng phương pháp saner sẽ được sử dụng tail:

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

Không có -clựa chọn cho head?
ADTC

Tôi nghĩ rằng anh ta có nghĩa là + $ ((1024 * 1024)): -c, --bytes = K xuất K byte cuối cùng; cách khác, sử dụng -c + K để xuất byte bắt đầu bằng
Kth

5
dd - giúp đỡ
Cách sử dụng: dd [OPERAND] ...
  hoặc: dd TÙY CHỌN
Sao chép một tập tin, chuyển đổi và định dạng theo toán hạng.

  bs = BYTES đọc và ghi byte BYTES tại một thời điểm (cũng xem ibs =, obs =)
  cbs = BYTES chuyển đổi byte BYTES tại một thời điểm
  conv = CONVS chuyển đổi tệp theo danh sách ký hiệu được phân tách bằng dấu phẩy
  đếm = BLOCKS chỉ sao chép các khối đầu vào BLOCKS
  ibs = BYTES đọc byte BYTES tại một thời điểm (mặc định: 512)
  if = FILE đọc từ FILE thay vì stdin
  iflag = FLAGS đọc theo danh sách ký hiệu được phân tách bằng dấu phẩy
  obs = BYTES ghi byte BYTES tại một thời điểm (mặc định: 512)
  of = FILE ghi vào FILE thay vì stdout
  oflag = FLAGS viết theo danh sách ký hiệu được phân tách bằng dấu phẩy
  tìm kiếm = BLOCKS bỏ qua các khối có kích thước quan sát BLOCKS khi bắt đầu xuất
  Skip = BLOCKS bỏ qua các khối có kích thước ibs BLOCK khi bắt đầu nhập
  status = noxfer đàn áp thống kê chuyển

BLOCKS và BYTES có thể được theo sau bởi các hậu tố nhân sau:
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, v.v. đối với T, P, E, Z, Y.

Nếu kích thước tệp chính xác là 10MB, 1024 * 10 10240K Điều này sẽ để lại 1024K cuối cùng. Bạn nên chỉ định kích thước khối bạn đang làm việc bằng cách sử dụng các tùy chọn ibs và 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

Bạn cũng có thể bỏ qua 1MB đầu tiên của tệp, sử dụng tùy chọn bỏ qua để đọc đến cuối tệp bỏ qua 1 MB đầu tiên.

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

Sử dụng tùy chọn tìm kiếm, bạn có thể viết một vị trí cụ thể trong tệp đầu ra của mình. Giả sử bạn muốn giữ 1MB đầu tiên và ghi lại 8 MB cuối cùng.

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

Bạn có thể cần nhận được một số chi tiết về kích thước tệp của mình để đảm bảo bạn nhận được đúng lượng dữ liệu vào và ra.

ls -s --block-size 1K ./my/10MB/file
người đàn ông ls

       --block-size = KÍCH THƯỚC
              sử dụng các khối SIZE-byte. Xem định dạng KÍCH THƯỚC bên dưới

       -s, - kích thước
              in kích thước được phân bổ của mỗi tệp, trong các khối

       KÍCH THƯỚC có thể là (hoặc có thể là một số nguyên tùy ý theo sau) một trong số fol‐
       mức thấp: KB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024, v.v.
       P, E, Z, Y.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.