มีทางเลือกอื่นสำหรับ `dd 'หรือไม่?


14

ฉันควรใช้เครื่องมืออื่นใดในการอ่านและเขียนไฟล์ที่มีการตัด, การค้นหาและการข้าม ตัวเลือกบรรทัดคำสั่งของ dd ดูไม่สะดวกและแปลกปลอมและฉันไม่ชอบการเลือกระหว่างโหมดการค้นหาที่ช้า แต่แม่นยำ ( bs=1) และรวดเร็ว แต่โหมดยืดหยุ่น ( bs=4kหรืออะไรก็ตาม)

มีเครื่องมือที่ทันสมัยกว่าในการอ่าน 555 ไบต์จากไฟล์หนึ่งไฟล์ (หรือไพพ์หรือซ็อกเก็ตหรือ dev) จากตำแหน่ง 31337 และเขียนลงในไฟล์อื่นที่ตำแหน่ง 128205 (โดยใช้บล็อก 512 + 43) โดยมีหรือไม่มีการตัดปลาย


2
ddผมยังไม่เห็นสิ่งผิดปกติกับ คุณสามารถใส่ shell script wrapper ไว้รอบ ๆ หากคุณไม่ชอบอินเตอร์เฟส ddอยู่ในมาตรฐาน POSIXซึ่งเป็นข้อดีอย่างมาก
jw013

2
สิ่งที่ผิดหลักคือไม่สามารถค้นหาหรือข้ามบล็อกเศษส่วน สิ่งที่สองที่ผิดที่status=noxferไม่ได้เป็นค่าเริ่มต้นและใช้งานไม่ได้และฉันต้องการiflag=fullblock(ละเว้นในบาง script => ข้อมูลที่เสียหาย)
วิ

4
1. bs=1=> ไปป์ไลน์ทั้งหมดช้า ตัวอย่างเช่นฉันอาจต้องการถ่ายโอนไฟล์วิดีโอที่เริ่มต้นจากเฟรมที่แน่นอนบางอย่าง 2. "ต้องใช้เลขคณิตบางอย่าง" => ไม่เหมาะสำหรับผู้ใช้ oneliners และคำสั่งเชลล์ปกติ
วิ

1
PSA: dd conv=seek_bytesจะทำให้seekทำงานด้วยความแม่นยำไบต์
i336_

1
@ i336_ ฉันคิดว่ามันหมายถึงว่าตัวเลือกที่ปลอดภัยที่สุดสำหรับเราคือการหลีกเลี่ยงการใช้เชลล์สคริปต์และเขียนไฟล์ปฏิบัติการแบบสแตติกลิงก์แบบสแตนด์อโลน ฉันเพิ่งไปซื้อของเพื่อหาทางเลือกเพราะบางครั้งฉันได้ยินเรื่องบ้า ๆ ที่เป็นไปได้โดยตรงในการทุบตีและสงสัยว่าการเข้าถึงไฟล์โดยตรงอาจเป็นหนึ่งในสิ่งที่บ้าเหล่านั้น
Trejkaz

คำตอบ:


4

มีเครื่องมือddrescue(ระวังยังมีdd_rescueซึ่งเป็นโปรแกรมที่แตกต่างกับการทำงานเกือบเหมือนกัน) มันใช้ไวยากรณ์ที่คุ้นเคยมากขึ้นด้วยเส้นประเดียวสำหรับเส้นประสั้นหรือคู่สำหรับตัวเลือกยาว จากหน้าคน:

   -i, --input-position=<bytes>
          starting position in input file [0]

   -K, --skip-size=<bytes>
          initial size to skip on read error [64 KiB]

   -M, --retrim
          mark all failed blocks as non-trimmed

   -o, --output-position=<bytes>
          starting position in output file [ipos]

1
ddrescue - --> Infile and outfile are the same., ->ddrescue /dev/stdin /dev/stdout Infile and outfile are the same.จุดเริ่มต้นของเรื่องราวไม่ดี ...
Vi

dd_rescueฉันแค่พยายามกับ มันจะส่งสัญญาณเตือนว่าไฟล์ (stdin) นั้นหาไม่ได้ แต่จะดำเนินต่อไป คุณสามารถลองดู อย่างไรก็ตามddrescueรู้สึกถึงคุณลักษณะที่ครบถ้วนและเป็นผู้ใหญ่ยิ่งขึ้น
Marco

1
@Vi: อย่ายิงผู้ส่งสาร ddrescueถูกต้องไม่สามารถหาท่อได้ หากคุณต้องการเริ่มอ่าน ณ จุดใดจุดหนึ่งในไฟล์คุณจะต้องให้สิทธิ์การเข้าถึงไฟล์ดังกล่าวไม่ใช่ข้อมูลที่ส่งจากโปรแกรมอื่น นอกจากนี้ระวังว่าการใช้ท่อต่อสู้กับความต้องการของคุณเพื่อความเร็วสูงสุดเนื่องจากวิธีเดียวที่จะเลียนแบบการค้นหาในท่อคือการอ่านและทิ้งชิ้นส่วนที่คุณไม่ต้องการดำเนินการ การค้นหาภายในไฟล์จริงนั้นมีประสิทธิภาพมากกว่า
Warren Young

อันที่จริงตั้งแต่เครื่องมือถูกออกแบบมาสำหรับการช่วยเหลือข้อมูลเสียมีไม่มีความสามารถในท่อ นี่เป็นความอัปยศเล็กน้อยเมื่อคุณต้องการความยืดหยุ่นในการค้นหาผ่านไฟล์อินพุต แต่เพียงต้องการส่งผลลัพธ์ไปยัง stdout แม้ว่ามันจะยอดเยี่ยมก็ตาม
การแข่งขัน Lightness ใน Orbit

3

pvทางเลือกที่ดีคือ ไม่เพียงคำนวณขนาดบล็อกที่มีประสิทธิภาพที่สุดโดยอัตโนมัติเร่งความเร็วสิ่งต่าง ๆ แต่ยังให้ความคืบหน้าเหนือสิ่งอื่นใด มันใช้ง่ายมาก:

pv < /dev/sda > sda.img

มันเล่นได้ดีกับการบีบอัดด้วย วิธีที่รวดเร็วในการสำรองและบีบอัดดิสก์ในครั้งเดียวเป็นดังนี้:

pv < /dev/sdb | pigz -9 > disk.img.gz

คุณสามารถเรียนรู้เพิ่มเติมที่นี่


1
คุณสมบัติหลักที่คาดหวังคือการค้นหาในไฟล์เอาต์พุตและอินพุตซึ่ง pv (มุมมองไพพ์) ไม่ได้จัดเตรียมไว้เนื่องจากไม่มีการค้นหาไพพ์
วิ

2

dcflddเป็นอีกทางเลือก dd ไม่ได้ตอบคำถามของ OP เกี่ยวกับอินพุต / เอาต์พุตแสวงหาความยืดหยุ่น แต่อาจเป็นประโยชน์ต่อผู้อื่นที่มาถึงที่นี่ผ่านการค้นหาโดย Google

มันขึ้นอยู่กับ gnu dd ด้วยคุณสมบัติเพิ่มเติมดังต่อไปนี้:

  • Hashing on-the-fly - dcfldd สามารถแฮชข้อมูลอินพุตขณะที่มันกำลังถูกถ่ายโอนซึ่งช่วยให้แน่ใจว่ามีความถูกต้องของข้อมูล
  • สถานะเอาท์พุท - dcfldd สามารถอัปเดตผู้ใช้ของความคืบหน้าในแง่ของปริมาณข้อมูลที่ถ่ายโอนและการดำเนินการนานเท่าใด
  • ผ้าเช็ดทำความสะอาดดิสก์ที่มีความยืดหยุ่น - dcfldd สามารถใช้ในการเช็ดดิสก์ได้อย่างรวดเร็วและมีรูปแบบที่เป็นที่รู้จักหากต้องการ
  • อิมเมจ / ลบการตรวจสอบ - dcfldd สามารถตรวจสอบว่าไดรฟ์เป้าหมายเป็นการจับคู่แบบบิตต่อบิตของอินพุตไฟล์หรือรูปแบบที่ระบุ
  • เอาต์พุตหลายตัว - dcfldd สามารถส่งออกไปยังหลาย ๆ ไฟล์หรือดิสก์ในเวลาเดียวกัน
  • เอาต์พุตแบบแยก - dcfldd สามารถแยกเอาต์พุตเป็นหลายไฟล์ที่มีการกำหนดค่าได้มากกว่าคำสั่ง split
  • piped output และ logs - dcfldd สามารถส่งข้อมูล log และ output ทั้งหมดไปยังคำสั่งรวมถึงไฟล์ได้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.