จะสร้างไฟล์ขนาดใหญ่ใน UNIX ได้อย่างไร?


17

ฉันพบวิธีใน Windows ในการทำสิ่งนั้น

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

มีวิธีใดใน UNIX ที่จะคัดลอกไฟล์ผนวกและทำซ้ำกระบวนการหรือไม่? สิ่งที่ชอบfor .. cat file1.txt > file1.txt?


เหตุใดจึงต้องคัดลอกไฟล์และผนวกแทนการต่อท้าย?
123

@ 123 ผนวกเป็นสิ่งที่ดี แต่วิธีการทำวง?
Thomas Lee

4
for i in {1..1000000};do echo "string" >> file;doneในทุบตี
123

9
มันต้องเป็นไฟล์ข้อความหรือไม่? คุณสามารถสร้างไฟล์ได้ทุกขนาดตั้งแต่ / dev / zero หรือ / dev / urandom
RealSkeptic

2
ฉันคาดว่าtype file >> fileจะทำงานในวงวนไม่สิ้นสุด (อย่างน้อยก็ทันทีที่มีขนาดใหญ่พอที่จะไม่พอดีกับบัฟเฟอร์)
Stéphane Chazelas

คำตอบ:


29
yes "Some text" | head -n 100000 > large-file

ด้วยcsh/ tcsh:

repeat 10000 echo some test > large-file

ด้วยzsh:

{repeat 10000 echo some test} > large-file

บนระบบ GNU โปรดดู:

seq 100000 > large-file

หรือ:

truncate -s 10T large-file

(สร้างไฟล์เบาบาง 10TiB (ขนาดใหญ่มาก แต่ไม่ได้ใช้พื้นที่ใด ๆ บนดิสก์)) และทางเลือกอื่น ๆ ที่กล่าวถึง"สร้างไฟล์ทดสอบที่มีจำนวนมากของศูนย์ไบต์"


การทำcat file >> fileจะเป็นความคิดที่ไม่ดี

ครั้งแรกมันไม่ทำงานกับcatการใช้งานบางอย่างที่ปฏิเสธที่จะอ่านไฟล์ที่เหมือนกับไฟล์เอาท์พุท แต่แม้ว่าคุณจะหลีกเลี่ยงมันด้วยการทำcat file | cat >> fileถ้าfileมันมีขนาดใหญ่กว่าcatบัฟเฟอร์ภายในของมันนั่นจะทำให้เกิดcatการทำงานในวงวนไม่สิ้นสุดเนื่องจากมันจะจบลงด้วยการอ่านข้อมูลที่เขียนไว้ก่อนหน้านี้

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


19
หรือdd if=/dev/zero of=large-file bs=1024 count=1024สำหรับไฟล์ 1MB
doneal24

7
@ DougO'Neal ฉันเห็นว่าdd if=/dev/zero of=test bs=1M count=1ชัดเจน
123


1
หรือใช้ / dev / urandom แทน / dev / ศูนย์ถ้าคุณต้องการข้อมูลแบบสุ่ม
user253751

3
@ robertotomásใช่ทุกคนใช้ddแต่ฉันไม่เคยเข้าใจว่าทำไม ในความเป็นจริงฉันคิดว่าฉันเคยใช้มันเพื่ออ่าน MBR หรืองานที่คล้ายกัน ในประสบการณ์ของฉันเครื่องมืออื่น ๆ ddได้เร็วขึ้นง่ายขึ้นและปลอดภัยมากขึ้นสำหรับส่วนใหญ่ของกรณีที่คนใช้ ผมคิดว่านี่เป็นหนึ่งในกรณีที่ร่วมกัน! = ดีที่สุดเหมือนหรือsudo su cat file | grep foo
terdon

22

คุณสามารถสร้างไฟล์ขนาดใหญ่บน Solaris โดยใช้:

mkfile 10g /path/to/file

อีกวิธีหนึ่งที่ใช้งานได้บน Solaris (และ Linux):

truncate -s 10g /path/to file

นอกจากนี้ยังเป็นไปได้ที่จะใช้:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240

dd one เหมือนเทราไบต์
123

1
กำหนด "ไฟล์ขนาดใหญ่" :-) แต่ผมแก้ไขตั้งแต่ตัวอย่างอื่น ๆ ของรัฐทั้งหมด 10g ...
แลมเบิร์

truncate ไม่สามารถใช้งาน 'truncate' ไม่มีไฟล์หรือไดเรกทอรีเช่น Truncate ที่ดูเหมือนว่าเป็น Linux เท่านั้น
schily

truncateไม่มีอยู่ใน Solaris 11.2+
Lambert

11

วิธีที่เร็วที่สุดที่เป็นไปได้ในการสร้างไฟล์ขนาดใหญ่ในระบบ Linux คือfallocate:

sudo fallocate -l 2G bigfile

fallocateจัดการกับระบบไฟล์และไม่ได้เขียนไปยังภาคข้อมูลโดยค่าเริ่มต้นและอย่างรวดเร็วมาก ข้อเสียคือมันจะต้องถูกเรียกใช้ในฐานะรูท

เมื่อใช้งานต่อเนื่องเป็นวงคุณสามารถเติมระบบไฟล์ที่ใหญ่ที่สุดได้ในเวลาไม่กี่วินาที

จาก man fallocate

fallocate ใช้เพื่อจัดการกับพื้นที่ดิสก์ที่จัดสรรสำหรับไฟล์ไม่ว่าจะเป็นการจัดสรรคืนหรือจัดสรรล่วงหน้า
สำหรับระบบไฟล์ที่รองรับการเรียกใช้ระบบ fallocate การจัดสรรล่วงหน้าทำได้อย่างรวดเร็วโดยการจัดสรรบล็อกและทำเครื่องหมายว่าไม่มีการกำหนดค่าเริ่มต้นโดยไม่ต้องใช้ IO กับบล็อกข้อมูล นี่คือเร็วกว่าการสร้างไฟล์โดยเติมด้วยศูนย์
รองรับ XFS (ตั้งแต่ Linux 2.6.38), ext4 (ตั้งแต่ Linux 3.0), Btrfs (ตั้งแต่ Linux 3.7) และ tmpfs (ตั้งแต่ Linux 3.5)


1
นี่ควรเป็นคำตอบที่ยอมรับได้ ง่ายและรวดเร็ว
ardochhigh

8

สิ่งนี้จะดำเนินต่อไปจนกว่าคุณจะ CTRL-C:

yes This is stuff that I want to put into my file... >> dummy.txt

ระวังเพราะคุณจะได้รับหลายร้อยบรรทัดต่อวินาที ...

จากman yes:

yes - output a string repeatedly until killed

นี่เป็นวิธีที่ง่ายมากในการสร้างไฟล์ขนาดใหญ่ในสภาพแวดล้อมของลินุกซ์
Chaminda Bandara

1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtจะช่วยให้คุณได้รับจำนวนที่แม่นยำ (-n $ TARGET_NUMBER_OF_LINES) yesจะตายโดยอัตโนมัติอันเป็นผลมาจาก 'ไปป์ที่ขาด' เมื่อheadสิ้นสุดเพราะถึงจำนวนเป้าหมายแล้ว
PypeBros

4

ถ้าฉันเข้าใจคุณถูกต้องคุณกำลังมองหาสิ่งที่ชอบ:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

ที่จะสร้างไฟล์ที่มี 22 รายการซ้ำของ "test line" หากคุณต้องการขนาดไฟล์เฉพาะคุณสามารถใช้สิ่งนี้ (บน Linux) 1024 คือหนึ่งกิโลไบต์:

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

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

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

โปรดทราบว่าวิธีการแก้ปัญหานี้มักจะเกินขนาดที่ต้องการเพราะหากไฟล์มีขนาดเกินขีด จำกัด ทุกอย่างจะถูกเข้าสู่ระบบอีกครั้ง

ท้ายที่สุดถ้าสิ่งที่คุณต้องการคือไฟล์ขนาดที่ต้องการและไม่ต้องการให้มีอะไรจริง ๆ คุณสามารถใช้truncate:

truncate -s 1M file

1
ไม่cating ไฟล์จริงมีประโยชน์ใด ๆ ที่จะเพียงแค่ต่อท้ายว่า? ดูเหมือนว่าจะใช้เวลานานขึ้นเนื่องจากต้องแยกกระบวนการที่สองออกทุกลูปและย้ายเนื้อหาทั้งหมดหลายครั้ง
123

1
@ ความเร็ว 123 catวิธีการเป็นมากเร็ว มันสมเหตุสมผลสำหรับการสร้างไฟล์ขนาดใหญ่ แต่มันสร้างไฟล์ 545M ใน 10 วินาทีบนเครื่องของฉัน whileลูปเดียวกันกับที่echo "test line" >> fileสร้างไฟล์ 96K ในระยะเวลาเท่ากัน
terdon

ฉันเดาว่าด้วยวิธี "cat" คือมันเพิ่มขึ้นแบบทวีคูณ เมื่อเริ่มต้นการทำซ้ำครั้งที่สอง 'newfile' มี 1 บรรทัดและ 'file' มี 2 และเมื่อเสร็จแล้ว 'newfile' คือ 3 บรรทัดและ 'file' คือ 5 ถัดไป 'newfile' จะเป็น 8 และ ' ไฟล์ 'จะเป็น 13. ถัดไป (21, 34) ฯลฯ
PypeBros

ข้อเสีย: อาจใช้พื้นที่ดิสก์เพิ่มเติม (> = 1.5 * ที่ต้องการ_size) กว่าขนาดไฟล์เป้าหมายในขณะที่กำลังสร้างไฟล์
PypeBros

BTW หากคุณมีtruncateอยู่แล้วคุณสามารถtruncate -s 1Gสร้างไฟล์ได้ตั้งแต่แรก unix.stackexchange.com/a/269184/85549 คุณสามารถแทนที่ด้วย a head -c $DESIRED_SIZE, อาจอยู่ในwhileลูป
PypeBros

3

โดยการไพพ์เนื้อหาของ/dev/urandomถึงheadคุณสามารถเปลี่ยนทิศทางเอาต์พุตไปยังไฟล์ดังนั้น:

 cat /dev/urandom | head --bytes=100 >> foo.bar

จะให้ไฟล์ที่มีขยะ 100 ไบต์แก่คุณ


1
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

ผลเดียวกันของสคริปต์ windows ของคุณ แต่ใน bash คุณไม่สามารถต่อไฟล์เข้ากับตัวเองได้โดยตรง


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