Comment créer un fichier aléatoire de 1 Go sous Linux?

89

J'utilise le shell bash et aimerais diriger la sortie de la commande openssl rand -base64 1000vers la commande ddtelle que dd if={output of openssl} of="sample.txt bs=1G count=1. Je pense que je peux utiliser des variables mais je ne suis cependant pas sûr de la meilleure façon de le faire. La raison pour laquelle je voudrais créer le fichier est parce que je voudrais un fichier de 1 Go avec du texte aléatoire.

PeanutsMonkey
la source

Réponses:

131

if=n'est pas obligatoire, vous pouvez diriger quelque chose dans dd:

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

Cela ne serait pas utile ici car il openssl randfaut de toute façon spécifier le nombre d'octets. Donc, vous n'avez pas réellement besoin dd- cela fonctionnerait:

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

1 gigaoctet correspond généralement à 2 à 30 octets (bien que vous puissiez utiliser 10**910 10 octets à la place). La * 3/4pièce représente le temps système Base64, ce qui fait que la sortie codée est de 1 Go.

Alternativement, vous pouvez utiliser /dev/urandom, mais ce serait un peu plus lent que OpenSSL:

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

Personnellement, j'utiliserais bs=64M count=16ou similaire:

dd if=/dev/urandom of=sample.txt bs=64M count=16
Grawity
la source
2
J'ai posté une question concernant la compression de gros fichiers à l' adresse superuser.com/questions/467697/… et j'ai été avisée que l'utilisation /dev/urandomgénère un fichier binaire et non un fichier texte.
PeanutsMonkey
2
@PeanutsMonkey: Droite; vous auriez besoin de quelque chose comme dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt.
Scott
3
@PeanutsMonkey: Il n'y a pas de "scénario du monde réel" unique. Certains scénarios peuvent traiter des gigaoctets de texte, d'autres - des gigaoctets de JPEG ou des gigaoctets de logiciels compilés ... Si vous voulez beaucoup de texte, téléchargez un dump Wikipedia pour exemple.
Grawity
2
@PeanutsMonkey: Le ddlecteur lit 750 000 000 octets /dev/urandomet les transfère dans uuencode. uuencodecode son entrée dans une forme d’encodage base64 (pas nécessairement compatible avec d’autres programmes). En d'autres termes, cela convertit les données binaires en texte. J'ai utilisé 750M parce que je me fie à l'affirmation de grawity selon laquelle le codage en base64 dilate les données de 33⅓%, vous devez donc demander autant de données binaires que vous le souhaitez dans votre fichier texte.
Scott
3
Notez que si elle dit que dd: warning: partial read (33554431 bytes); suggest iflag=fullblockcela créera un fichier tronqué , ajoutez donc le iflag=fullblockdrapeau, cela fonctionnera
rogerdpack
25

Créez un fichier de contenu aléatoire de 1GB.bin:

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

anneb
la source
3
Pour moi, iflag=fullblockétait l'addition nécessaire par rapport à d'autres réponses.
dojuba
2

Si vous voulez EXACTEMENT 1 Go, vous pouvez utiliser les éléments suivants:

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

La commande openssl rend un fichier exactement 1 octet trop grand. La commande tronquer supprime cet octet.

Joel Jacobs
la source
Cet octet supplémentaire est probablement dû à la -base64. Si vous le supprimez, vous obtiendrez un fichier de taille correcte.
Daniel
-1

Essayez ce script.

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

Ce script peut fonctionner aussi longtemps que cela ne vous dérange pas d'utiliser /dev/random.

#!/bin/bash
dd if=/dev/random of="sample.txt bs=1G count=1"
Jonathan Reno
la source
8
Je ne recommanderais pas de gaspiller /dev/randomcela à moins qu'il y ait une très bonne raison de le faire. /dev/urandomest beaucoup moins cher.
Ansgar Wiechers
1
En outre, la $var=(command)syntaxe n'est pas valide dans ce contexte.
Grawity
@grawity - Quand vous dites que ce n'est pas valide, que voulez-vous dire?
PeanutsMonkey
Je veux dire exactement cela - c'est incorrect.
Grawity
3
@grawity, @PeanutsMonkey: il a fait une faute de frappe; il voulait dire random=$(openssl rand -base64 1000). Bien que je me demande si bashvous pourriez attribuer une valeur d'un gigaoctet à une variable. Et même si vous dites random=$(openssl rand -base64 1000), la suite if=$randomn'a pas de sens.
Scott