วิธีสร้างไฟล์ด้วยขนาดที่กำหนดใน Linux?


157

เพื่อการทดสอบฉันต้องสร้างไฟล์ที่มีขนาดที่แน่นอน (เพื่อทดสอบขีด จำกัด การอัพโหลด)

คำสั่งในการสร้างไฟล์ที่มีขนาดที่แน่นอนบน Linux คืออะไร?


คำตอบ:


187
dd if=/dev/zero of=upload_test bs=file_size count=1

ในกรณีที่file_sizeมีขนาดของไฟล์ทดสอบของคุณในไบต์


โอ้นั่นอาจจะมีประสิทธิภาพมากกว่าแนวทางของฉันเพราะมันทำได้ในบล็อกเดียว ความคิดที่ดี.
พอลทอมบลิน

10
ที่จริงแล้วการใช้บล็อกขนาดใหญ่จะทำงานได้แย่ลงมากเมื่อมันใหญ่ขึ้นเนื่องจากมันจะจัดสรรและอ่านจำนวนนั้นในหน่วยความจำก่อนที่จะเขียน หากเป็นเช่นนั้น bs = 4GiB คุณอาจสิ้นสุดการแลกเปลี่ยน
Brian

35
ddมีขีด จำกัด ของ 2 ^ 32 สำหรับค่าของตนเพื่อที่จะสร้างไฟล์ที่มีขนาดใหญ่กว่า 4 GB dd if=/dev/zero of=test bs=1M count=<size in megabytes>มีเคล็ดลับ:
Dmytro Sirenko

2
ดูคำตอบต่อไปเพื่อหาวิธีที่ดีกว่าและรวดเร็วกว่า
ลูกเต๋าที่สง่างาม

2
@elegantdice ไม่ชัดเจนคำตอบต่อไปคือพวกเขาสามารถเปลี่ยนตำแหน่งของพวกเขา
vladkras

160

ได้โปรดสมัยใหม่นั้นง่ายกว่าและเร็วกว่า บน Linux (เลือกหนึ่งรายการ)

truncate -s 10G foo
fallocate -l 5G bar

จะต้องมีการระบุว่าtruncateในระบบไฟล์ที่สนับสนุนไฟล์กระจัดกระจายจะสร้างไฟล์กระจัดกระจายและfallocateจะไม่ ไฟล์กระจัดกระจายเป็นหนึ่งที่หน่วยการจัดสรรที่ทำขึ้นไฟล์จะไม่ได้รับการจัดสรรจริงจนกว่าจะใช้ meta-data สำหรับไฟล์จะใช้พื้นที่มากพอสมควร แต่ไม่มีแนวโน้มว่าจะอยู่ใกล้ขนาดที่แท้จริงของไฟล์ คุณควรศึกษาข้อมูลเกี่ยวกับไฟล์ที่กระจัดกระจายสำหรับข้อมูลเพิ่มเติมเนื่องจากมีข้อดีและข้อเสียของไฟล์ประเภทนี้ ไฟล์ที่ไม่กระจัดกระจายมีการจัดสรรบล็อก (หน่วยการจัดสรร) ล่วงหน้าซึ่งหมายความว่าพื้นที่ถูกจองเท่าที่ระบบไฟล์เห็น นอกจากนี้fallocateและtruncateจะไม่ตั้งค่าเนื้อหาของไฟล์เป็นค่าที่ระบุเช่น ddแทนเนื้อหาของไฟล์ที่จัดสรรด้วยfallocateหรือtruncateอาจเป็นค่าถังขยะใด ๆ ที่มีอยู่ในหน่วยที่จัดสรรระหว่างการสร้างและพฤติกรรมนี้อาจจะหรืออาจไม่ต้องการ ddเป็นที่ช้าที่สุดเพราะมันจริงเขียนค่าหรือก้อนของข้อมูลที่จะสตรีมไฟล์ทั้งหมดตามที่ระบุไว้ด้วยนั้นเลือกบรรทัดคำสั่ง

ลักษณะการทำงานนี้อาจแตกต่างกัน - ขึ้นอยู่กับระบบไฟล์ที่ใช้และความสอดคล้องของระบบไฟล์นั้นกับมาตรฐานหรือข้อกำหนด ดังนั้นจึงขอแนะนำให้ทำการวิจัยที่เหมาะสมเพื่อให้แน่ใจว่ามีการใช้วิธีการที่เหมาะสม


ฉันพยายามtruncateแล้ว มันสร้างไฟล์ขนาดศูนย์โดยใช้ไวยากรณ์ข้างต้น 'man page' ของfallocateบอกว่าไฟล์ที่สร้างนั้นว่างเปล่าspaceมากกว่าข้อมูล ดูเหมือนว่าจะไม่เป็นประโยชน์สำหรับบางกรณีเช่น "ใช้เวลานานแค่ไหนในการคัดลอกไฟล์ 1G"
Mark Stosberg

6
fallocate ดูเหมือนจะทำงานได้ดีสำหรับฉัน มันสร้างไฟล์ในขนาดที่เหมาะสม
Aater Suleman

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

4
หากคุณต้องการที่จะทำงานนี้อยู่ภายใต้ OSX brew install coreutilsแล้วคุณจะต้องทำเช่นนี้: นี้จะเพิ่มกรัมgtruncate -s 10G fooในด้านหน้าของคำสั่งเพื่อให้คุณต้องใช้มันเช่นนี้ หวังว่านี่จะช่วยได้!
DerekE

ดูเหมือนว่ามันจะไม่ทำงานบนNTFSพาร์ติชัน
eloyesp

40

เพียงแค่ติดตามโพสต์ของ Tomคุณสามารถใช้ dd เพื่อสร้างไฟล์แบบกระจายได้เช่นกัน:

dd if=/dev/zero of=the_file bs=1 count=0 seek=12345

การทำเช่นนี้จะสร้างไฟล์ที่มี "รู" อยู่ในยูนิกซ์ส่วนใหญ่ - ข้อมูลจะไม่ถูกเขียนลงดิสก์หรือใช้พื้นที่ใด ๆ จนกว่าจะมีสิ่งอื่นที่ไม่ใช่ศูนย์เขียนลงไป


การตั้งค่า count = 0 หลีกเลี่ยงการลบไบต์จากขนาดไฟล์
andrewdotn

3
ด้วยcount=0, bs * seekกลายเป็นขนาดไฟล์
Jayen

24

บน OSX (และ Solaris ดูเหมือนว่า) mkfileคำสั่งก็มีให้เช่นกัน:

mkfile 10g big_file

ทำให้ไฟล์มีขนาด 10 GB ชื่อ "big_file" พบวิธีนี้ที่นี่


สิ่งนี้มีประโยชน์สำหรับสถานการณ์เช่น OS X ที่ไม่มีคำสั่งtruncateและ ยังใช้งานได้ตามที่อธิบายไว้ข้างต้นแม้ว่าจะใช้กับเมกะไบต์ก็ตาม fallocateddmM
user535673

ผิด: สิ่งนี้จะสร้างไฟล์10 GiB (= ~ 10,7 GB)
ของหวาน

20

ใช้คำสั่งนี้:

ถ้า dd = $ INPUT-FILE จาก = $ OUTPUT-FILE bs = $ BLOCK-SIZE count = $ NUM-BLOCKS

เพื่อสร้างขนาดใหญ่ (ว่าง) $INPUT-FILE=/dev/zeroไฟล์ชุด ขนาดของไฟล์จะ
ไฟล์ใหม่ที่สร้างขึ้นจะเป็น $BLOCK-SIZE * $NUM-BLOCKS
$OUTPUT-FILE


ทำไมคุณถามคำถาม
Henry B

9
ฉันต้องขอคำตอบจาก Google ดังนั้นฉันจึงวางมันไว้ที่นี่ดังนั้นจึงสามารถพูดคุยและเก็บข้อมูลให้ทันสมัยอยู่เสมอ ... คุณรู้ไหมว่าจุดรวมของทั้งไซต์?
Grundlefleck

2
ฉันรู้ว่าผู้คนโหวตให้ @Grundlefleck สำหรับการแชท XP แต่เขามีประเด็น - วิธีหนึ่งในการใช้เว็บไซต์นี้ตามที่ Jeff และ Joel จินตนาการไว้คือการตั้งคำถามและคำตอบสำหรับสิ่งที่คุณเพิ่งค้นพบ
Paul Tomblin

3
ขอบคุณพอล แม้ว่าฉันจะไม่ได้ใส่ใจกับประเด็นเหล่านี้ แต่ฉันก็ยังใส่ใจกับสิ่งที่ฉันพบใน Google ซึ่งอาจมีข้อบกพร่องในบางวิธีที่ฉันไม่เคยรู้เกี่ยวกับเรื่องนี้เว้นแต่ฉันจะถามที่นี่ คนควรจะรู้สึกอิสระที่จะทำให้ชุมชน Q / ฉันเป็นเจ้าของถ้าพวกเขาคิดว่าฉันเที่ยวผู้หญิง, shrugs
Grundlefleck

2
การอ้างอิงจากคำถามที่พบบ่อยของ "มันก็ดีที่จะถามและตอบคำถามการเขียนโปรแกรมของคุณเอง แต่แสร้งทำเป็นว่าคุณกำลังตกอยู่ในอันตราย: วลีในรูปแบบของคำถาม"
Craig Angus

17

คุณสามารถทำได้โดยทางโปรแกรม:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main() {
    int fd = creat("/tmp/foo.txt", 0644);
    ftruncate(fd, SIZE_IN_BYTES);
    close(fd);
    return 0;
}

วิธีนี้มีประโยชน์อย่างยิ่งต่อการmmap ในภายหลังไฟล์ในหน่วยความจำในภายหลัง

ใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่าไฟล์มีขนาดที่ถูกต้อง:

# du -B1 --apparent-size /tmp/foo.txt

ระวัง:

# du /tmp/foo.txt

อาจจะพิมพ์0เพราะมันถูกจัดสรรเป็นไฟล์ Sparseหากระบบไฟล์ของคุณรองรับ

ดูเพิ่มเติม: man 2 openและman 2 truncate


10

คุณสามารถทำได้:

[dsm@localhost:~]$ perl -e 'print "\0" x 100' > filename.ext

โดยที่คุณแทนที่ 100 ด้วยจำนวนไบต์ที่คุณต้องการเขียน


และการกรอกข้อมูลไบต์จริงเช่นกัน ฉันต้องการ "\ xff" และใช้งานได้ดี ขอบคุณ! :)
Ray

10

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

 dd if=/dev/zero of=upload_test bs=10000 count=1

ฉันสามารถบีบอัด upload_testลงไปประมาณ 200 ไบต์ ดังนั้นคุณสามารถทำให้ตัวเองอยู่ในสถานการณ์ที่คุณคิดว่าการอัปโหลดไฟล์ 10KB แต่จริง ๆ แล้วมันจะน้อยกว่ามาก

สิ่งที่ผมขอแนะนำให้ใช้แทน/dev/urandom /dev/zeroฉันไม่สามารถบีบเอาท์พุทได้/dev/urandomมากเลย


ระบบฝังตัวของฉันไม่มี/dev/zeroดังนั้นจึง/dev/urandomเป็นเรื่องดี
Fredrick Gauss


4

มีคำตอบมากมาย แต่ก็ไม่มีใครอธิบายได้ว่ามีอะไรอีกที่สามารถทำได้ การค้นหาman pages สำหรับ ddเป็นไปได้ที่จะระบุขนาดของไฟล์ได้ดียิ่งขึ้น

นี่จะเป็นการสร้าง /tmp/zero_big_data_file.bin ที่เต็มไปด้วยเลขศูนย์ซึ่งมีขนาด 20 เมกะไบต์:

    dd if=/dev/zero of=/tmp/zero_big_data_file.bin  bs=1M count=20

นี่จะเป็นการสร้าง /tmp/zero_1000bytes_data_file.bin ที่เต็มไปด้วยเลขศูนย์ซึ่งมีขนาด 1000 ไบต์:

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1kB count=1

หรือ

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1000 count=1

  • ในตัวอย่างทั้งหมด bs คือขนาดบล็อกและนับเป็นจำนวนบล็อก
  • บล็อกและ BYTES อาจตามด้วยคำต่อท้ายแบบคูณต่อไปนี้: c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M GB = 1000 * 1000 * 1,000, G = 1024 * 1024 * 1024 และอื่น ๆ สำหรับ T, P, E, Z, Y


3

สิ่งนี้จะสร้างไฟล์ข้อความขนาด 4 MB ที่มีตัวอักษรแบบสุ่มในไดเรกทอรีปัจจุบันและชื่อ "4mb.txt" คุณสามารถเปลี่ยนพารามิเตอร์เพื่อสร้างขนาดและชื่อที่แตกต่างกัน

base64 /dev/urandom | head -c 4000000 > 4mb.txt

0

ใช้ fallocateหากคุณไม่ต้องการรอดิสก์

ตัวอย่าง:

fallocate -l 100G BigFile

การใช้งาน:

Usage:
 fallocate [options] <filename>

Preallocate space to, or deallocate space from a file.

Options:
 -c, --collapse-range remove a range from the file
 -d, --dig-holes      detect zeroes and replace with holes
 -i, --insert-range   insert a hole at range, shifting existing data
 -l, --length <num>   length for range operations, in bytes
 -n, --keep-size      maintain the apparent size of the file
 -o, --offset <num>   offset for range operations, in bytes
 -p, --punch-hole     replace a range with a hole (implies -n)
 -z, --zero-range     zero and ensure allocation of a range
 -x, --posix          use posix_fallocate(3) instead of fallocate(2)
 -v, --verbose        verbose mode

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