Bagaimana cara membuat file acak 1GB di Linux?

88

Saya menggunakan bash shell dan ingin menyalurkan keluar dari perintah openssl rand -base64 1000ke perintah ddseperti dd if={output of openssl} of="sample.txt bs=1G count=1. Saya pikir saya bisa menggunakan variabel tetapi saya tidak yakin bagaimana cara terbaik untuk melakukannya. Alasan saya ingin membuat file adalah karena saya ingin file 1GB dengan teks acak.

Kacang Kacang Tanah
sumber

Jawaban:

130

if=tidak diperlukan, Anda bisa memasukkan sesuatu ke pipa ddsebagai gantinya:

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

Ini tidak akan berguna di sini karena openssl randmemerlukan menentukan jumlah byte pula. Jadi Anda sebenarnya tidak perlu dd- ini akan berhasil:

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

1 gigabyte biasanya 2 30 byte (meskipun Anda bisa menggunakan 10**910 9 byte sebagai gantinya). Bagian * 3/4menyumbang overhead Base64, membuat output yang disandikan 1 GB.

Atau, Anda bisa menggunakan /dev/urandom, tetapi itu akan sedikit lebih lambat dari OpenSSL:

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

Secara pribadi, saya akan menggunakan bs=64M count=16atau serupa:

dd if=/dev/urandom of=sample.txt bs=64M count=16
grawity
sumber
2
Saya memposting pertanyaan tentang mengompresi file besar di superuser.com/questions/467697/… dan disarankan agar menggunakan /dev/urandommenghasilkan file biner dan bukan file teks yang sebenarnya.
PeanutsMonkey
2
@PeanutsMonkey: Kanan; Anda akan membutuhkan sesuatu seperti dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt.
Scott
3
@PeanutsMonkey: Tidak ada satu "skenario dunia nyata", beberapa skenario mungkin berhubungan dengan gigabytes teks, yang lain - dengan gigabytes JPEG, atau gigabytes perangkat lunak yang dikompilasi ... Jika Anda ingin banyak teks, unduh dump Wikipedia untuk contoh.
grawity
2
@PeanutsMonkey: ddMembaca 750.000.000 byte dari /dev/urandomdan menyalurkannya ke uuencode. uuencodemengkodekan inputnya ke dalam bentuk pengkodean base64 (tidak harus konsisten dengan program lain). Dengan kata lain, ini mengubah data biner menjadi teks. Saya menggunakan 750M karena saya percaya pernyataan grawity bahwa pengkodean base64 memperluas data sebesar 33%, jadi Anda perlu meminta ¾ data biner sebanyak yang Anda inginkan dalam file teks Anda.
Scott
3
Catatan jika dikatakan dd: warning: partial read (33554431 bytes); suggest iflag=fullblockakan membuat file terpotong jadi tambahkan iflag=fullblockbenderanya, maka itu berfungsi.
rogerdpack
25

Buat file konten acak 1GB.bin:

dd if = / dev / urandom = 1GB.bin bs = 64M count = 16 iflag = fullblock

anneb
sumber
3
Bagi saya, iflag=fullblockadalah tambahan yang diperlukan dibandingkan dengan jawaban lain.
dojuba
2

Jika Anda ingin PERSIS 1GB, maka Anda dapat menggunakan yang berikut ini:

openssl rand -out $ testfile -base64 792917038; truncate -s-1 $ testfile

Perintah openssl membuat file tepat 1 byte terlalu besar. Perintah truncate memotong byte itu.

Joel Jacobs
sumber
Byte tambahan itu mungkin karena -base64. Menghapusnya akan menghasilkan file dengan ukuran yang benar.
Daniel
-1

Coba skrip ini.

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

Skrip ini mungkin berfungsi selama Anda tidak keberatan menggunakan /dev/random.

#!/bin/bash
dd if=/dev/random of="sample.txt bs=1G count=1"
Jonathan Reno
sumber
8
Saya tidak akan merekomendasikan membuang-buang /dev/randomini kecuali ada alasan yang sangat bagus untuk melakukannya. /dev/urandomjauh lebih murah.
Ansgar Wiechers
1
Juga, $var=(command)bukan sintaks yang valid dalam konteks ini.
grawity
@grawity - Ketika Anda mengatakan itu tidak valid, apa maksud Anda?
PeanutsMonkey
Maksud saya persis - itu tidak benar.
grawity
3
@grawity, @PeanutsMonkey: Dia membuat kesalahan ketik; maksudnya random=$(openssl rand -base64 1000). Meskipun saya akan mempertanyakan apakah bashakan membiarkan Anda menetapkan nilai gigabyte-panjang untuk suatu variabel. Dan bahkan jika Anda mengatakannya random=$(openssl rand -base64 1000), kalimat selanjutnya if=$randomtidak masuk akal.
Scott