นี่คือวิธีที่คุณสามารถทำได้:
i=$(((t=19876543212)-(h=12345678901)))
{ dd count=0 skip=1 bs="$h"
dd count="$((i/(b=64*1024)-1))" bs="$b"
dd count=1 bs="$((i%b))"
} <infile >outfile
นั่นคือทั้งหมดที่จำเป็นจริงๆ - มันไม่ต้องการอะไรมากมาย ในสถานที่แรกdd count=0 skip=1 bs=$block_size1
จะlseek()
ผ่านการป้อนไฟล์ปกติในทางปฏิบัติทันที ไม่มีโอกาสที่จะพลาดข้อมูลใด ๆ หรือมีการบอกถึงความจริงใด ๆ เกี่ยวกับเรื่องนี้คุณสามารถค้นหาตำแหน่งเริ่มต้นที่คุณต้องการได้โดยตรง เนื่องจาก file descriptor เป็นเจ้าของโดยเชลล์และdd
เป็นเพียงการสืบทอดมันจะส่งผลต่อตำแหน่งเคอร์เซอร์และคุณสามารถทำตามขั้นตอน จริงๆมันเป็นเรื่องง่ายมาก - dd
และไม่มีเครื่องมือมาตรฐานดีเหมาะกับงานมากกว่า
ที่ใช้ขนาดบล็อก 64k ซึ่งมักจะเหมาะ ขัดกับความเชื่อที่ได้รับความนิยมบล็อคขนาดใหญ่ไม่dd
ทำงานเร็ว ในทางกลับกันบัฟเฟอร์เล็ก ๆ ก็ไม่ดีเช่นกัน dd
จำเป็นต้องซิงโครไนซ์เวลาในการเรียกใช้ระบบเพื่อให้ไม่จำเป็นต้องรอในการคัดลอกข้อมูลลงในหน่วยความจำและออกอีกครั้ง แต่ยังไม่จำเป็นต้องรอในการเรียกระบบ ดังนั้นคุณต้องการให้มีเวลามากพอที่สิ่งต่อไปread()
ไม่จำเป็นต้องรอในขั้นสุดท้าย แต่ไม่มากจนคุณต้องบัฟเฟอร์ในขนาดที่ใหญ่กว่าที่จำเป็น
ดังนั้นdd
ข้ามแรกไปยังตำแหน่งเริ่มต้น ที่ใช้เป็นศูนย์เวลา คุณสามารถเรียกโปรแกรมอื่น ๆ ที่คุณชอบ ณ จุดนั้นเพื่ออ่าน stdin และมันจะเริ่มอ่านโดยตรงที่ไบต์ที่คุณต้องการ ฉันโทรdd
ไปอีกอันเพื่ออ่าน((interval / blocksize) -1)
count blocks ถึง stdout
สิ่งสุดท้ายที่จำเป็นคือการคัดลอกโมดูลัส(ถ้ามี)ของการแบ่งส่วนก่อนหน้านี้ และนั่นคือสิ่งที่
อย่าเชื่อเมื่อผู้คนระบุข้อเท็จจริงบนใบหน้าของพวกเขาโดยไม่มีหลักฐาน ใช่มันเป็นไปได้สำหรับdd
การทำอ่านสั้น(แม้ว่าสิ่งนั้นเป็นไปไม่ได้เมื่ออ่านจากอุปกรณ์ป้องกันเพื่อสุขภาพ - จึงชื่อ) สิ่งต่าง ๆ เหล่านี้เป็นไปได้เฉพาะถ้าคุณทำไม่ถูกต้องบัฟเฟอร์dd
กระแสที่อ่านจากอื่นนอกเหนือจากอุปกรณ์บล็อก ตัวอย่างเช่น:
cat data | dd bs="$num" ### incorrect
cat data | dd ibs="$PIPE_MAX" obs="$buf_size" ### correct
ในทั้งสองกรณีdd
สำเนาทั้งหมดของข้อมูล ในกรณีแรกเป็นไปได้(แต่ไม่น่าcat
เป็นไปได้ด้วย)ว่าบล็อกเอาต์พุตบางตัวที่dd
คัดลอกออกจะบิตเท่ากับ "$ num" ไบต์เพราะdd
มันเป็นสเป็คเพียงเพื่อบัฟเฟอร์อะไรเลยเมื่อบัฟเฟอร์ถูกร้องขอโดยเฉพาะในคำสั่งของมัน - ไลน์. bs=
แสดงถึงขนาดบล็อกสูงสุดเนื่องจากจุดประสงค์ของการdd
เป็นแบบ real-time i / o
ในตัวอย่างที่สองฉันระบุการบล็อกเอาท์พุทและdd
บัฟเฟอร์อย่างชัดเจนจนกระทั่งสามารถเขียนได้อย่างสมบูรณ์ แต่นั่นไม่ได้ส่งผลกระทบต่อcount=
ที่อยู่บนพื้นฐานของการป้อนข้อมูลบล็อก dd
แต่การที่คุณเพียงแค่ต้องอีก ข้อมูลที่ผิดใด ๆ ที่ให้ไว้กับคุณเป็นอย่างอื่นควรได้รับการเพิกเฉย
bs=1M iflag=skip_bytes,count_bytes