Wie erstelle ich eine zufällige 1-GB-Datei unter Linux?

88

Ich benutze die Bash-Shell und möchte das aus dem Befehl openssl rand -base64 1000zum Befehl ddwie leiten dd if={output of openssl} of="sample.txt bs=1G count=1. Ich glaube, ich kann Variablen verwenden, bin mir aber nicht sicher, wie ich das am besten machen soll. Der Grund, warum ich die Datei erstellen möchte, ist, dass ich eine 1-GB-Datei mit zufälligem Text haben möchte.

PeanutsMonkey
quelle

Antworten:

130

if=ist nicht erforderlich, Sie können ddstattdessen etwas weiterleiten:

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

Dies wäre hier nicht sinnvoll, da openssl randdie Anzahl der Bytes ohnehin angegeben werden muss. Also brauchst du eigentlich nicht dd- das würde funktionieren:

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

1 Gigabyte entspricht normalerweise 2 bis 30 Bytes (obwohl Sie stattdessen 10**910 bis 9 Bytes verwenden können). Der * 3/4Teil macht den Base64-Overhead aus, sodass die codierte Ausgabe 1 GB beträgt.

Alternativ könnten Sie verwenden /dev/urandom, aber es wäre etwas langsamer als OpenSSL:

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

Persönlich würde ich folgendes verwenden bs=64M count=16:

dd if=/dev/urandom of=sample.txt bs=64M count=16
Grawity
quelle
2
Ich stellte eine Frage , große Dateien in Bezug auf Komprimierung superuser.com/questions/467697/... und wurde darauf hingewiesen , dass unter Verwendung /dev/urandomerzeugt eine binäre Datei und nicht um eine echte Textdatei.
PeanutsMonkey
2
@PeanutsMonkey: Richtig; du würdest sowas brauchen dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt.
Scott
3
@PeanutsMonkey: Es gibt kein einziges "reales Szenario". Einige Szenarien befassen sich möglicherweise mit Gigabyte Text, andere mit Gigabyte JPEGs oder Gigabyte kompilierter Software. Wenn Sie viel Text benötigen, laden Sie ein Wikipedia-Dump für herunter Beispiel.
Grawity
2
@PeanutsMonkey: Der ddliest 750.000.000 Bytes aus /dev/urandomund leitet sie weiter uuencode. uuencodecodiert seine Eingabe in eine Form von Base64-Codierung (nicht unbedingt konsistent mit anderen Programmen). Mit anderen Worten konvertiert dies Binärdaten in Text. Ich habe 750M verwendet, weil ich der Aussage von grawity vertraute, dass die Base64-Codierung die Daten um 33⅓% vergrößert. Sie müssen also nach ¾ so vielen Binärdaten fragen, wie Sie in Ihrer Textdatei möchten.
Scott
3
Beachten Sie, dass es funktioniert, wenn angezeigt dd: warning: partial read (33554431 bytes); suggest iflag=fullblockwird, dass eine abgeschnittene Datei erstellt wird. Fügen Sie also das iflag=fullblockFlag hinzu.
Rogerdpack
25

Erstellen Sie eine zufällige 1GB.bin-Inhaltsdatei:

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

anneb
quelle
3
Für mich iflag=fullblockwar die notwendige Ergänzung vergleichbar mit anderen Antworten.
Dojuba
2

Wenn Sie GENAU 1 GB möchten, können Sie Folgendes verwenden:

openssl rand -out $ testfile -base64 792917038; schneide -s-1 $ testdatei ab

Mit dem Befehl openssl wird eine Datei genau 1 Byte zu groß. Der Befehl "Truncate" schneidet dieses Byte ab.

Joel Jacobs
quelle
Dieses zusätzliche Byte liegt wahrscheinlich an der -base64. Wenn Sie es entfernen, wird eine Datei mit der richtigen Größe erstellt.
Daniel
-1

Versuchen Sie dieses Skript.

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

Dieses Skript funktioniert möglicherweise so lange, wie es Ihnen nichts ausmacht /dev/random.

#!/bin/bash
dd if=/dev/random of="sample.txt bs=1G count=1"
Jonathan Reno
quelle
8
Ich würde nicht empfehlen, dies zu verschwenden, /dev/randomes sei denn, es gibt einen sehr guten Grund dafür. /dev/urandomist viel billiger.
Ansgar Wiechers
1
Auch $var=(command)ist nicht gültig Syntax in diesem Zusammenhang.
Grawity
@grawity - Wenn Sie sagen, dass es nicht gültig ist, was meinen Sie damit?
PeanutsMonkey
Ich meine genau das - es ist falsch.
Grawity
3
@grawity, @PeanutsMonkey: Er hat einen Tippfehler gemacht; meinte er random=$(openssl rand -base64 1000). Obwohl ich fragen würde, ob bashSie einer Variablen einen Gigabyte langen Wert zuweisen können. Und selbst wenn Sie sagen random=$(openssl rand -base64 1000), macht das Nachfolgende if=$randomkeinen Sinn.
Scott