วิธีการแพดขนาดไฟล์ที่ต้องการ?


15

ฉันมีไฟล์ที่ฉันต้องการแพดจนกว่าจะถึง 16 MiB (16777216 ไบต์) ปัจจุบันคือ 16515072 ไบต์ ความแตกต่างคือ 262144 ไบต์

ฉันจะรองมันได้อย่างไร

ดูเหมือนว่าจะใช้งานไม่ได้:

cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144

2
@terabyte; คุณต้องการช่องว่างทางกายภาพหรือช่องว่างทางตรรกะ? กล่าวอีกนัยหนึ่ง; ไฟล์ควรมีขนาดเพียง 16777216 (และอาจมีรู) หรือควรใช้พื้นที่เก็บข้อมูลบนดิสก์ด้วยหรือไม่ - BTW การเลือกbs=1ในddอยู่ในประสบการณ์ของฉันรันไทม์แพงมาก
Janis

5
truncate -s 16M thefile
frostschutz

4
@ Frostschutz ที่ต้องการคำตอบที่ดีคุณได้โพสต์มันเป็นคำตอบหรือไม่
Derobert

@derobert ผู้ใช้ไซต์ StackExchange กำลังโพสต์คำตอบที่ถูกต้องง่าย ๆ เหมือนกับความคิดเห็นคืออะไร
user1717828

@ user1717828 ไม่แน่ใจอาจเป็นคำถามที่ดีสำหรับเมตา
Derobert

คำตอบ:


10

วางof=largerfile.txtและผนวก stdout ต่อท้ายไฟล์:

dd if=/dev/zero bs=1 count=262144 >> largerfile.txt

1
seekเป็นตัวเลือกที่เหมาะสมที่นี่
0andriy

15

นอกจากคำตอบที่จะได้รับการเติมเต็มทางกายภาพแล้วคุณยังสามารถเว้นระยะห่างส่วนใหญ่ไว้ในไฟล์ที่ว่างเปล่า ("รู") โดยseekเข้าไปยังตำแหน่งสุดท้ายของไฟล์และเขียนตัวอักษรเดียว:

dd if=/dev/zero of=largerfile.txt bs=1 count=1 seek=16777215

(ซึ่งมีข้อได้เปรียบที่จะมีประสิทธิภาพมากขึ้นโดยเฉพาะกับbs=1และไม่ใช้พื้นที่ดิสก์เพิ่มเติมจำนวนมาก)

วิธีดังกล่าวดูเหมือนว่าจะทำงานได้โดยไม่ต้องเพิ่มตัวอักษรใด ๆ โดยใช้if=/dev/nullและขนาดไฟล์ที่ต้องการสุดท้าย:

dd if=/dev/null of=largerfile.txt bs=1 count=1 seek=16777216

ตัวแปรนักแสดงของวิธีการขยายแบบฟิสิคัลที่ใช้ขนาดบล็อกใหญ่กว่าคือ:

padding=262144 bs=32768 nblocks=$((padding/bs)) rest=$((padding%bs))
{
  dd if=/dev/zero bs=$bs count=$nblocks
  dd if=/dev/zero bs=$rest count=1
} 2>/dev/null >>largerfile.txt

3
แก้ไข. ในกรณีนี้truncate -s +262144 largerfile.txtก็จะเป็นไปอย่างรวดเร็ว
don_crissti

4

Anwser ที่ดีที่สุดที่นี่คือ Janis's (ด้านบน) เพราะมันช่วยให้คุณลืมขนาดไฟล์ปัจจุบันและแพดได้โดยตรงตามขนาดที่ต้องการโดยไม่มีการคำนวณ

นอกจากนี้ยังใช้ประโยชน์จากไฟล์ที่กระจัดกระจายซึ่งผนวก / dev / ศูนย์ไม่ได้

คำตอบอาจเป็นระเบียบเพราะแม้ว่า 'count' จะได้รับอนุญาตให้เป็น 0 และคุณยังคงได้รับการเติม:

dd if=/dev/null of=largerfile.txt bs=1 count=0 seek=16777216

(แก้ไข: สิ่งนี้ถูกต้องสำหรับ GNU dd แต่พฤติกรรมของcount=0เป็นเฉพาะแพลตฟอร์มดูความคิดเห็น)


คุณเข้าใจผิด: count=0ไม่ได้ระบุ แต่โดยทั่วไปจะเหมือนกับเมื่อไม่มีcountการระบุพารามิเตอร์ ปัญหาเพิ่มเติม: ddตัดไฟล์ไปที่ 16777216 ไบต์ แต่หากคุณหวังว่านี่จะเป็นการสร้างช่องโหว่ในตอนท้ายคุณจะเข้าใจผิดเพราะคุณต้องเขียนข้อมูลหลังจากหลุมแล้วตัดเป็นขนาดที่ไม่มีข้อมูลในภายหลัง .
schily

count = 0 ไม่เหมือนกับการระบุว่าไม่มีพารามิเตอร์ count คุณจะบอกว่าdd if=/dev/zero of=somefileเป็นเช่นเดียวกับdd if=/dev/zero of=somefile count=0? ลองมัน.
PeteC

แน่นอน! count=0 เป็นเช่นเดียวกับถ้าคุณไม่ได้ระบุพารามิเตอร์นับได้ทั้งหมด สิ่งนี้เป็นจริงอย่างน้อยสำหรับการใช้งานทั้งหมดที่ได้รับมาจากแหล่งดั้งเดิม ลองมันดูเหมือนว่าคุณไม่เคยทำงานกับddคำสั่งเดิม
Schily

ฉันไม่พบเอกสารที่ระบุว่า 0 เป็นค่าที่ไม่ซ้ำกันสำหรับcountความหมาย 'ละเว้นพารามิเตอร์นี้' คุณสามารถหาอะไรได้บ้าง หากไม่มีเอกสารดังกล่าวcount=0หมายความว่า 'เขียนศูนย์บล็อก' และการเบี่ยงเบนใด ๆ จากสิ่งนี้เป็นจุดบกพร่อง ... (แหล่งต้นฉบับหรือไม่)
PeteC

1
นี่คือเอกสาร POSIX จากก่อนพฤษภาคม 2015 เมื่อข้อความที่แก้ไขไม่ถูกต้องถูกแก้ไข
Schily

1

คุณต้องใช้ddหรือไม่? หากคุณต้องการให้ไฟล์มีความยาว (ตรรกะ) โดยเฉพาะเพียงแค่เขียนค่าศูนย์ไปยังตำแหน่งที่คุณต้องการ ไบต์ระหว่างปลายก่อนหน้านี้และไบต์ที่เขียนจะแสดงเป็นไบต์ที่มีค่าว่าง นี่คือตัวอย่างการใช้ Perl

$ echo Hello > file
$ ls -l file
-rw-r--r-- 1 user group 6 Apr 16 22:59 file
$ perl -le 'open(my $f,"+<","file"); seek($f, 16777216 - 2, 0); print $f "\0"'
$ ls -ln file
-rw-r--r-- 1 user group 16777216 Apr 16 22:59 file

ทำไมต้องเป็น "- 2" ในบรรทัด สคริปต์จะเขียนไบต์ดังนั้นเราจึงลบ 1 เพื่อค้นหาตำแหน่งก่อนไบต์นั้น เราถอดอีกอันเพราะตำแหน่งการค้นหานั้นไม่มีดัชนี

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