¿Cómo creo un archivo aleatorio de 1GB en Linux?

88

Estoy usando el shell bash y me gustaría canalizar la salida del comando openssl rand -base64 1000al comando ddcomo dd if={output of openssl} of="sample.txt bs=1G count=1. Creo que puedo usar variables, pero no estoy seguro de cuál es la mejor manera de hacerlo. La razón por la que me gustaría crear el archivo es porque me gustaría un archivo de 1GB con texto aleatorio.

CacahuetesMonkey
fuente

Respuestas:

130

if=no es obligatorio, puede canalizar algo en su ddlugar:

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

No sería útil aquí, ya que openssl randrequiere especificar el número de bytes de todos modos. Entonces, en realidad no es necesario dd, esto funcionaría:

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

1 gigabyte suele ser de 2 a 30 bytes (aunque puede utilizarlo 10**9para 10 9 bytes). La * 3/4parte representa la sobrecarga de Base64, lo que hace que la salida codificada sea de 1 GB.

Alternativamente, podría usar /dev/urandom, pero sería un poco más lento que OpenSSL:

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

Personalmente, usaría bs=64M count=16o similar:

dd if=/dev/urandom of=sample.txt bs=64M count=16
Gravedad
fuente
2
Publiqué una pregunta sobre la compresión de archivos grandes en superuser.com/questions/467697/… y me aconsejaron que el uso /dev/urandomgenera un archivo binario y no un archivo de texto verdadero.
PeanutsMonkey
2
@PeanutsMonkey: Derecha; lo que se necesita algo así dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt.
Scott
3
@PeanutsMonkey: No existe un único "escenario del mundo real", algunos escenarios pueden estar relacionados con gigabytes de texto, otros, con gigabytes de JPEG o gigabytes de software compilado ... Si desea mucho texto, descargue un volcado de Wikipedia para ejemplo.
Grawity
2
@PeanutsMonkey: ddLee 750,000,000 bytes /dev/urandomy los canaliza uuencode. uuencodecodifica su entrada en una forma de codificación base64 (no necesariamente coherente con otros programas). En otras palabras, esto convierte los datos binarios en texto. Utilicé 750M porque confié en la declaración de Grawity de que la codificación base64 expande los datos en un 33%, por lo que debe solicitar ¾ tantos datos binarios como desee en su archivo de texto.
Scott
3
Tenga en cuenta que si dice dd: warning: partial read (33554431 bytes); suggest iflag=fullblockque creará un archivo truncado, agregue la iflag=fullblockbandera, entonces funciona.
rogerdpack
25

Cree un archivo de contenido aleatorio de 1GB.bin:

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

anneb
fuente
3
Para mí, iflag=fullblockfue la adición necesaria en comparación con otras respuestas.
dojuba
2

Si desea EXACTAMENTE 1GB, puede usar lo siguiente:

openssl rand -out $ testfile -base64 792917038; truncar -s-1 $ archivo de prueba

El comando openssl hace que un archivo sea exactamente 1 byte demasiado grande. El comando truncar recorta ese byte.

Joel Jacobs
fuente
Ese byte adicional probablemente se deba a -base64. Eliminarlo dará como resultado un archivo con el tamaño correcto.
Daniel
-1

Prueba este script.

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

Este script puede funcionar siempre y cuando no te importe usarlo /dev/random.

#!/bin/bash
dd if=/dev/random of="sample.txt bs=1G count=1"
Jonathan Reno
fuente
8
No recomendaría desperdiciar /dev/randomen esto a menos que haya una muy buena razón para hacerlo. /dev/urandomEs mucho más barato.
Ansgar Wiechers
1
Además, $var=(command)no es una sintaxis válida en este contexto.
Grawity
@grawity: cuando dices que no es válido, ¿a qué te refieres?
PeanutsMonkey
Quiero decir exactamente eso, es incorrecto.
Grawity
3
@grawity, @PeanutsMonkey: Hizo un error tipográfico; él quiso decir random=$(openssl rand -base64 1000). Aunque me preguntaría si bashle permitiría asignar un valor de gigabyte de longitud a una variable. E incluso si lo dices random=$(openssl rand -base64 1000), lo posterior if=$randomno tiene sentido.
Scott