ฉันจะสร้างไฟล์สุ่ม 1GB ใน Linux ได้อย่างไร


88

ฉันใช้เปลือกทุบตีและต้องการที่จะออกจากท่อของคำสั่งopenssl rand -base64 1000คำสั่งเช่นdd dd if={output of openssl} of="sample.txt bs=1G count=1ฉันคิดว่าฉันสามารถใช้ตัวแปร แต่ฉันไม่แน่ใจว่าจะทำอย่างไรดีที่สุด เหตุผลที่ฉันต้องการสร้างไฟล์เพราะฉันต้องการไฟล์ 1GB พร้อมข้อความแบบสุ่ม

คำตอบ:


130

if=ไม่จำเป็นคุณสามารถไปป์ไลน์บางอย่างddแทน:

something... | dd of=sample.txt bs=1G count=1

มันจะไม่เป็นประโยชน์ที่นี่เนื่องจากopenssl randต้องระบุจำนวนไบต์ต่อไป ดังนั้นคุณไม่ต้องการจริง ๆdd- สิ่งนี้จะได้ผล:

openssl rand -out sample.txt -base64 $(( 2**30 * 3/4 ))

1 กิกะไบต์มักเป็น 2 30ไบต์ (แม้ว่าคุณสามารถใช้10**910 9ไบต์แทน) * 3/4บัญชีส่วน Base64 ค่าใช้จ่ายในการเข้ารหัสการส่งออก 1 GB

หรือคุณสามารถใช้/dev/urandomแต่จะช้ากว่า OpenSSL เล็กน้อย:

dd if=/dev/urandom of=sample.txt bs=1G count=1

ส่วนตัวฉันจะใช้bs=64M count=16หรือคล้ายกัน:

dd if=/dev/urandom of=sample.txt bs=64M count=16

2
ฉันโพสต์คำถามเกี่ยวกับการบีบอัดไฟล์ขนาดใหญ่ที่superuser.com/questions/467697/และได้รับคำแนะนำว่าการใช้/dev/urandomสร้างไฟล์ไบนารีไม่ใช่ไฟล์ข้อความจริง
PeanutsMonkey

2
@PeanutsMonkey: ถูกต้อง; คุณต้องการบางสิ่งเช่นdd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txtนี้
สกอตต์

3
@PeanutsMonkey: ไม่มี "สถานการณ์ในโลกแห่งความจริง" ที่เดียวสถานการณ์บางอย่างอาจเกี่ยวข้องกับกิกะไบต์ข้อความอื่น ๆ - ด้วยกิกะไบต์ของ JPEGs หรือซอฟต์แวร์ที่รวบรวมเป็นกิกะไบต์ ... หากคุณต้องการข้อความจำนวนมากดาวน์โหลดวิกิพีเดียถ่ายโอนข้อมูลสำหรับ ตัวอย่าง.
grawity

2
@PeanutsMonkey: ddอ่าน 750,000,000 ไบต์จาก/dev/urandomและส่งไปuuencodeยัง uuencodeเข้ารหัสอินพุตเป็นรูปแบบของการเข้ารหัส base64 (ไม่จำเป็นต้องสอดคล้องกับโปรแกรมอื่น ๆ ) กล่าวอีกนัยหนึ่งสิ่งนี้จะแปลงข้อมูลไบนารีเป็นข้อความ ฉันใช้ 750M เพราะฉันเชื่อถือได้ว่าคำสั่ง grawity ที่การเข้ารหัส base64 ขยายข้อมูล 33%% ดังนั้นคุณต้องถาม binary ข้อมูลไบนารีมากที่สุดเท่าที่คุณต้องการในไฟล์ข้อความของคุณ
สกอตต์

3
หมายเหตุหากมีข้อความระบุว่าdd: warning: partial read (33554431 bytes); suggest iflag=fullblockจะสร้างไฟล์ที่ถูกตัดทอนให้เพิ่มการiflag=fullblockตั้งค่าสถานะ
rogerdpack

25

สร้างไฟล์เนื้อหาแบบสุ่ม 1GB.bin:

dd if = / dev / urandom ของ = 1GB.bin bs = 64M จำนวน = 16 iflag = fullblock


3
สำหรับฉันมันiflag=fullblockเป็นสิ่งที่จำเป็นเมื่อเทียบกับคำตอบอื่น ๆ
dojuba

2

หากคุณต้องการ 1GB อย่างแน่นอนจากนั้นคุณสามารถใช้สิ่งต่อไปนี้:

openssl rand -out $ testfile -base64 792917038; ตัดทอน -s-1 $ testfile

คำสั่ง openssl ทำให้ไฟล์มีขนาดใหญ่เกิน 1 ไบต์ คำสั่ง truncate ตัดส่วนที่ไบต์ออก


-base64นั่นไบต์เสริมอาจจะเป็นเพราะ การลบไฟล์จะทำให้ไฟล์มีขนาดที่ถูกต้อง
Daniel

-1

ลองใช้สคริปต์นี้

#!/bin/bash
openssl rand -base64 1000 | dd of=sample.txt bs=1G count=1

/dev/randomสคริปต์นี้อาจจะทำงานตราบเท่าที่คุณไม่คิดใช้

#!/bin/bash
dd if=/dev/random of="sample.txt bs=1G count=1"

8
ฉันจะไม่แนะนำให้เสีย/dev/randomสิ่งนี้เว้นแต่จะมีเหตุผลที่ดีที่จะทำเช่นนั้น /dev/urandomราคาถูกกว่ามาก
Ansgar Wiechers

1
นอกจากนี้$var=(command)ไวยากรณ์ไม่ถูกต้องในบริบทนี้
grawity

@grawity - เมื่อคุณพูดว่าไม่ถูกต้องคุณหมายถึงอะไร
PeanutsMonkey

ฉันหมายถึงตรงนั้น - มันไม่ถูกต้อง
grawity

3
@grawity, @PeanutsMonkey: เขาพิมพ์ผิด random=$(openssl rand -base64 1000)เขาหมายถึง แม้ว่าฉันจะถามว่าbashจะให้คุณกำหนดค่ากิกะไบต์ยาวให้กับตัวแปร และแม้ว่าคุณจะพูดrandom=$(openssl rand -base64 1000)ตามมาif=$randomก็ไม่สมเหตุสมผล
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.