ใช้ `dd 'เพื่อตัดส่วนท้ายไฟล์


18

อาจมีเคล็ดลับง่ายๆในการทำเช่นนี้ แต่ฉันไม่สามารถหาได้จากหน้าคน

ฉันจะตัด 1MB สุดท้ายจากไฟล์ที่มีขนาดที่ไม่ระบุได้ddอย่างไรโดยใช้?


1
คุณต้องการสำเนาของไฟล์นั้นยกเว้น 1MB สุดท้ายหรือคุณต้องการคัดลอก MB ล่าสุดไปยังไฟล์อื่นหรือไม่
Mat

ฉันต้องการ 1MB สุดท้าย
zetah

คำตอบ:


29

สมมติว่าคุณมีstatและbashคุณสามารถรับขนาดไฟล์ด้วย:

stat -c %s your_file

หากคุณต้องการแยก$amountไบต์สุดท้ายสำหรับไฟล์ddนั้นคุณสามารถ:

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

แต่วิธี saner จะใช้tail:

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

ไม่มี-cตัวเลือกสำหรับhead?
ADTC

ฉันคิดว่าเขาหมายถึง + $ ((1024 * 1024)): -c, --bytes = K เอาต์พุต K ไบต์สุดท้าย; หรือใช้ -c + K เพื่อเอาท์พุทไบต์เริ่มต้นด้วย Kth ของแต่ละไฟล์
Vanuan

5
dd - ช่วย
การใช้งาน: dd [OPERAND] ...
  หรือ: dd OPTION
คัดลอกไฟล์แปลงและจัดรูปแบบตามตัวถูกดำเนินการ

  bs = BYTES อ่านและเขียนไบต์ทีละไบต์ (ดูที่ ibs =, obs =)
  cbs = BYTES แปลงไบต์ทีละไบต์
  conv = CONVS แปลงไฟล์ตามรายการสัญลักษณ์คั่นด้วยเครื่องหมายจุลภาค
  count = BLOCKS คัดลอกบล็อกอินพุต BLOCKS เท่านั้น
  ibs = BYTES อ่านไบต์ทีละไบต์ (ค่าเริ่มต้น: 512)
  if = FILE อ่านจาก FILE แทน stdin
  iflag = FLAGS อ่านตามรายการสัญลักษณ์คั่นด้วยเครื่องหมายจุลภาค
  obs = BYTES เขียนไบต์ทีละไบต์ (ค่าเริ่มต้น: 512)
  of = FILE เขียนไปที่ FILE แทน stdout
  oflag = FLAGS เขียนตามรายการสัญลักษณ์คั่นด้วยเครื่องหมายจุลภาค
  แสวงหา = บล็อกข้ามบล็อกบล็อกขนาดที่จุดเริ่มต้นของการส่งออก
  skip = BLOCKS ข้าม BLOCKS บล็อกขนาด ibs ตอนเริ่มอินพุต
  status = noxfer ยับยั้งสถิติการโอน

บล็อกและ BYTES อาจตามด้วยคำต่อท้าย multiplicative ต่อไปนี้:
c = 1, w = 2, b = 512, kB = 1,000, K = 1024, MB = 1,000 * 1,000, M = 1024 * 1024, xM = M
GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024 และอื่น ๆ สำหรับ T, P, E, Z, Y

หากขนาดไฟล์เท่ากับ 10MB, 1024 * 10 10240K สิ่งนี้จะทำให้ 1024K สุดท้าย คุณควรระบุขนาดบล็อกที่คุณใช้ด้วยการใช้ตัวเลือก ibs และ 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

นอกจากนี้คุณยังสามารถข้าม 1MB แรกของไฟล์โดยใช้ตัวเลือกการข้ามเพื่ออ่านไปยังจุดสิ้นสุดของไฟล์ที่ข้าม 1MB แรก

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

การใช้ตัวเลือกการค้นหาคุณสามารถเขียนไปยังสถานที่เฉพาะในไฟล์เอาต์พุตของคุณ สมมติว่าคุณต้องการเก็บ 1MB แรกขึ้นไปเขียน 8MB สุดท้าย

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

คุณอาจต้องรับรายละเอียดบางอย่างเกี่ยวกับขนาดไฟล์ของคุณเพื่อให้แน่ใจว่าคุณได้รับข้อมูลในปริมาณที่เหมาะสม

ls -s --block-size 1K ./my/10MB/file
ผู้ชาย

       --block-size = ขนาด
              ใช้บล็อก SIZE-byte ดูรูปแบบ SIZE ด้านล่าง

       -s, - ขนาด
              พิมพ์ขนาดที่จัดสรรของแต่ละไฟล์เป็นบล็อก

       SIZE อาจเป็น (หรืออาจจะเป็นจำนวนเต็มตามด้วย) หนึ่งใน fol‐
       lowing: KB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024 และอื่น ๆ สำหรับ G, T,
       P, E, Z, Y
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.