ฉันจะสร้างไฟล์ที่มีขนาดเฉพาะจากบรรทัดคำสั่งได้อย่างไร


125

ฉันจะสร้างไฟล์ได้อย่างไร (เช่นใช้touchคำสั่งหรือวิธีอื่นที่คล้ายกัน) แต่มีขนาดเฉพาะ (เช่น 14 MB)

กรณีการใช้งานคือการทดสอบ FTP ด้วยขนาดไฟล์ต่าง ๆ หากเราสามารถสร้างไฟล์ที่มีขนาดเฉพาะจะเป็นประโยชน์ในการตรวจสอบการถ่ายโอน FTP เป็นต้น


9
คำถาม SO ที่เกี่ยวข้อง: stackoverflow.com/questions/257844/…
Der Hochstapler

คำตอบ:


158

การใช้truncate:

truncate -s 14M filename

จากman truncate:

DESCRIPTION
   Shrink or extend the size of each FILE to the specified size

[...]

 -s, --size=SIZE
          set or adjust the file size by SIZE

หมายเหตุ: truncateอาจไม่สามารถใช้ได้ในระบบของคุณเช่นบน Mac OS X ซึ่งไม่ได้ติดตั้งตามค่าเริ่มต้น (แต่คุณสามารถติดตั้งได้อย่างง่ายดายโดยใช้ macports เป็นต้น) ในกรณีเหล่านี้คุณอาจจำเป็นต้องใช้ddหรือheadแทน


2
ว้าว. ดีมากฉันไม่รู้เรื่องนี้
n611x007

ผู้ชายบอกว่ามันทั้งหมด: ตัด - ย่อหรือขยายขนาดของไฟล์ให้เป็นขนาดที่ระบุ
ssedano

12
ดีมากจริงๆ touchไม่จำเป็น แต่คุณก็สามารถเรียกใช้truncate -s 14M filenameมันจะสร้างfilenameโดยตรง
terdon

เจ๋ง ... นี่คือสิ่งที่ฉันมองหา ... ขอบคุณ @ oliver-salzburg
fasil

34
ดูเหมือนว่าจะสร้างไฟล์กระจัดกระจายในขณะที่คำตอบด้านล่าง (ที่ใช้ "dd") ไม่ได้ ฉันไม่รู้ว่าความแตกต่างสำคัญกับคุณหรือไม่ แต่ฉันคิดว่าฉันจะชี้ให้เห็น
offby1

100

แก้ไข: วิธีที่ง่ายที่สุดน่าจะtruncateเป็นคำตอบของ Ashutosh Vishwa Bandhu แต่ดังที่ชี้ให้เห็นโดย@ offby1ที่สร้างไฟล์ที่กระจัดกระจายซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ โซลูชันด้านล่างสร้างไฟล์เต็มปกติ


คำสั่งต่อไปนี้สร้างไฟล์ 14MB ที่เรียกว่าfoo:

  1. fallocate(ขอบคุณ@Breakthroughที่แนะนำในความคิดเห็นและโหวตคำตอบของ Ahmed Masud ด้านล่างซึ่งระบุไว้ด้วย)

    fallocate -l 14000000 foo
    

    คำสั่งนี้น่าประทับใจโดยเฉพาะอย่างยิ่งเนื่องจากมันเร็วเท่ากับtruncate(ทันที) โดยไม่คำนึงถึงขนาดไฟล์ที่ต้องการ (ไม่เหมือนกับโซลูชั่นอื่น ๆ ซึ่งจะช้าสำหรับไฟล์ขนาดใหญ่) และยังสร้างไฟล์ปกติไม่ใช่แบบเบาบาง:

    $ truncate -s 14MB foo1.txt 
    $ fallocate -l 14000000 foo2.txt 
    $ ls -ls foo?.txt 
        0 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:54 foo1.txt
    13672 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:55 foo2.txt
    
  2. สร้างไฟล์ที่เต็มไปด้วยข้อมูลแบบสุ่ม

    dd if=/dev/urandom of=foo bs=14MB count=1
    

                                                                              หรือ

    head -c 14MB /dev/urandom > foo
    
  3. สร้างไฟล์ที่เต็มไปด้วย\0s:

    dd if=/dev/zero of=foo.txt bs=14MB count=1
    

                                                                              หรือ

    head -c 14MB /dev/zero > foo
    
  4. สร้างไฟล์ที่เต็มไปด้วยข้อมูล 14MB แรกของไฟล์อื่น:

    head -c 14MB bar.txt > foo
    
  5. สร้างไฟล์ที่เต็มไปด้วยข้อมูล 14MB สุดท้ายของไฟล์อื่น:

    tail -c 14MB bar.txt > foo
    

ในทุกตัวอย่างข้างต้นไฟล์จะ14*1000*1000ถ้าคุณต้องการ14*1024*1024แทนที่ด้วยMB Mตัวอย่างเช่น:

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo

fallocate ข้อเสนอเป็นไบต์เท่านั้นดังนั้นคุณต้องทำ (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo

2
ขอบคุณ ... นอกจากนี้ยังจะตอบสนองวัตถุประสงค์ของฉันในการสร้างไฟล์ขนาดที่ต้องการ ...
Fasil

2
ฉันขอแนะนำให้ต่อต้านการใช้งานddหากมีวิธีการที่ง่ายกว่าและไม่ทำลาย
acolyte

3
@acolyte ฉันก็จะเป็นเช่นนั้นนั่นคือเหตุผลที่แต่ละddวิธีมีทางเลือกที่ไม่ใช่ DD
terdon

1
รายการ wiki บอกว่าแม้ dd (ด้วยศูนย์) จะสร้างไฟล์แบบเบาบางใช่มั้ย en.wikipedia.org/wiki/Sparse_file
Michael

1
@Michael ฉันตรวจสอบเพียงเพื่อให้แน่ใจและไม่มีคำสั่งของฉันผลิตไฟล์กระจัดกระจาย คำสั่งบนหน้าวิกิพีเดียที่แตกต่างกันอย่างสมบูรณ์และไม่ได้ใช้dd /dev/zeroสำหรับผู้ที่มีเหตุผลMหรือMBมีเหตุผลมากกว่า man man ของhead , tailและddระบุไว้อย่างชัดเจนว่า "MB = 1,000 * 1,000, M = 1024 * 1024" สิ่งนี้อาจแตกต่างจาก * nixes อื่น ๆ
terdon

21
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

คำเตือน ddจะเขียนทับสิ่งที่คุณมีสิทธิ์ที่จะเขียนหากคุณระบุด้วยความเต็มใจหรือโดยไม่ตั้งใจ ทำให้แน่ใจว่าคุณเข้าใจddเช่น กับการอ่านdd --helpและคุณไม่ได้กรูขึ้นบรรทัดคำสั่ง DD ของคุณหรืออื่น ๆ คุณสามารถสร้างการสูญเสียข้อมูลกลับไม่ได้ - แม้ทั้งหมด

สำหรับการเริ่มต้น, if=เป็นแฟ้มใส่และof=คือไฟล์ที่ส่งออก มักจะตรวจสอบว่าคุณได้รับมันขวาก่อนที่จะใช้คำสั่ง :)


13

ใช้เวทย์มนตร์dd;) หน้าคน

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336

สาเหตุ 14MB * 1024 = 14336KB หรือ:

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14

และคุณจะได้ไฟล์ output.dat ขนาด 14mb ซึ่งเต็มไปด้วยเลขศูนย์: D


8

นี่ควรเป็นวิธีที่เร็วที่สุดที่จะทำ:

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 

มิฉะนั้นเพียงแค่เขียนโปรแกรม C หรือ Perl ที่รวดเร็วและสกปรกที่จะค้นหาตำแหน่งที่แน่นอนและเขียนไบต์เดียว นี่เป็นจำนวนมากเร็วกว่าการทิ้งข้อมูลลงบนบล็อก

หากคุณต้องการที่จะหลีกเลี่ยงไฟล์เบาบางแล้วบน Linux (และระบบอื่น ๆ อาจจะ) คุณสามารถใช้จากfallocate -l <length>util-linux

หากไม่สามารถใช้งานได้และคุณมีระบบที่เข้ากันได้กับ POSIX คุณสามารถเขียนโปรแกรมที่รวดเร็วและสกปรกโดยใช้การเรียกไลบรารี่ posix_fallocate () posix_fallocate รับประกันการจัดสรรช่วงที่ระบุดังนั้นคุณจะไม่ได้รับดิสก์เต็มเมื่อใช้ช่วงต่อมาหากส่งคืนสำเร็จ


6

ในขณะที่ddเป็นวิธีพกพาที่จะทำคำสั่งmkfileและxfs_mkfileเขียนเฉพาะสำหรับวัตถุประสงค์นี้และเร็วขึ้น:

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename

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

โดยค่าเริ่มต้นที่พวกเขาสร้างศูนย์ที่เต็มไปด้วยไฟล์และไม่โปร่ง (หรือ "โพรง") ไฟล์ พวกเขาทั้งคู่-nเลือกที่จะสร้างไฟล์แบบเบาบางแทน


1

มีตัวเลือกอื่นด้วย Perl:

perl -e 'print "a" x 1024' > file.txt

สิ่งนี้จะสร้างไฟล์ 1KB แทนที่ 1024 ด้วยหมายเลขที่คุณต้องการ

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