เขียน n ไบต์จากไฟล์หนึ่งไปอีกอันหนึ่งใน Bash


7

สวัสดีฉันจะเขียนnไบต์จากไฟล์หนึ่งไปเป็นไฟล์ใหม่โดยเริ่มจากkตำแหน่งโดยใช้ Bash ได้อย่างไร

  • ตัวอย่างเช่นถ้า n = 60, k = 1 และขนาดไฟล์ = 100 ดังนั้น: ไฟล์ที่ 2 จะประกอบด้วยตั้งแต่ไบต์ที่ 1 จนถึง 60 ไบต์และจะมีขนาด 60 ไบต์
  • ตัวอย่างเช่นถ้า n = 40, k = 61 และขนาดไฟล์ = 100 ดังนั้น: ไฟล์ที่ 2 จะประกอบด้วยตั้งแต่ 61st ไปจนถึง 100 ไบต์และจะมีขนาด 40 ไบต์

อาจเป็นไปได้ว่าเรากำลังทำงานกับไฟล์ไบนารีไม่ใช่ไฟล์ ASCII ดังนั้นการต่อข้อมูล 2 ส่วนควรจะเหมือนกับไฟล์ต้นฉบับ!

(เป็นไปได้ด้วยddหรือไม่)


2
ดูddและskip, countและibsตัวเลือก
choroba

คำตอบ:


11

ใช่. ตามหน้าdd manคุณกำลังมองหาสิ่งที่ชอบ:

dd bs=1 count=60 if=_filename_1_ of=_filename_2_
dd bs=1 skip=60 count=40 if=_filename_1_ of=_filename_2_

โดยที่_filename_n_จะถูกแทนที่ด้วยชื่อไฟล์จริง

bs=1หมายความว่าcountและskipนับเป็นไบต์ skipคือจำนวนที่จะข้าม; countคือจำนวนที่จะคัดลอก แก้ไขจำนวนไบต์เริ่มต้นจาก 0 ไม่ใช่ 1 ดังนั้นหากต้องการเริ่มต้นที่ไบต์แรกให้ใช้skip=0(หรือskipไม่ระบุรายละเอียด)

ในฐานะที่เป็นฟังก์ชั่นทุบตีคุณสามารถใช้:

# copy_nk(n, k, infile, outfile)
copy_nk() {
    dd bs=1 count="$1" skip="$2" ${3:+if="$3"} ${4:+of="$4"}
}

แล้วเรียกมันว่า

copy_nk 60 0 infile.txt outfile.txt

(ด้วย k = 0เพราะจำนวนไบต์เริ่มต้นที่ศูนย์)

ด้วย${3:+...}, คุณสามารถปล่อยไฟล์เอาต์พุตหรือไฟล์อินพุตทิ้งได้ เช่น,

cat infile.txt | copy_nk 60 0 > outfile.txt

ตัวนับดัชนีเริ่มจาก 0 หรือ 1 ดังนั้นฉันเดาว่าการข้ามคือ1หมายความว่าเริ่มจากไบต์ที่ 2 ถูกต้องไหม
PiNewbie

5

นี่เป็นอีกวิธีใช้headและกลุ่มคำสั่ง bash:

{ head -c60 > /dev/null ; head -c40 > output.txt ; } < input.txt

คนแรกheadที่นี่อ่าน 60 ไบต์แรกจาก input.txt และส่งไปที่ถังบิต

เนื่องจากheadคำสั่งเหล่านี้อยู่ในกลุ่มคำสั่งตำแหน่งไฟล์ภายใน input.txt จะถูกเก็บไว้ ดังนั้นที่สองheadจะอ่าน 40 ไบต์ถัดไป (จากไบต์ 61 ถึง 100 โดยใช้การจัดทำดัชนีแบบ 1) และเขียนลงใน output.txt


ในความเป็นจริงวิธีการนี้สามารถทำให้เป็นลักษณะทั่วไปได้splitเช่นเดียวกับการทำงาน แต่ด้วยประโยชน์เพิ่มเติมของความสามารถในการระบุความยาวของไฟล์เอาต์พุตแต่ละไฟล์ สมมติว่าเรามีไฟล์ 100 ไบต์ที่เราต้องการแยกออกเป็นชิ้นขนาด 7, 50, 23 และส่วนที่เหลือ เราทำได้:

{
    head -c7 > 7bytes.txt
    head -c50 > 50bytes.txt
    head -c23 > 23bytes.txt
    cat > remaining-bytes.txt
} < input.txt

3
คุณสามารถทำให้ระบบไฟล์เสียหายheadได้อย่างง่ายดาย (หรือง่ายกว่า) หากคุณบ้าพอที่จะส่งออกไฟล์ไปยังอุปกรณ์บล็อก แน่นอนคุณจะไม่ทำเช่นนั้น - คุณจะใช้ddแทนหรืออย่างอื่นที่มีความหมายสำหรับงาน เหตุผลddของชื่อเสียงที่น่ากลัวก็คือมันมีความแข็งแกร่งเพียงพอที่คุณจะสามารถใช้งานได้อย่างปลอดภัยมากขึ้นหรือน้อยลงสำหรับงานที่เป็นอันตรายเช่นการโคลนภาพดิสก์หากคุณระมัดระวังมากพอ แน่นอนว่าบางคนไม่ได้และจะทำให้ดิสก์ยุ่งเหยิง แต่เหตุผลที่ไม่ใช่เพราะพวกเขาใช้ddมันเป็นสิ่งที่พวกเขาทำ/dev/sdaในตอนแรก
Ilmari Karonen

ดีมาก! head -cผมไม่ทราบเกี่ยวกับ
cxw

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

@IlmariKaronen ยุติธรรมมากพอ - ฉันลบ Anti- ddFUD ที่ไม่จำเป็นออกไปแล้ว
Digital Trauma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.