Come faccio a creare un file casuale da 1 GB in Linux?


88

Sto usando la shell bash e vorrei eseguire il pipe out del comando openssl rand -base64 1000al comando ddcome dd if={output of openssl} of="sample.txt bs=1G count=1. Penso di poter usare le variabili ma non sono sicuro del modo migliore per farlo. Il motivo per cui vorrei creare il file è perché vorrei un file da 1 GB con testo casuale.

Risposte:


130

if=non è richiesto, puoi invece inserire qualcosa in dd:

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

Non sarebbe utile qui poiché openssl randrichiede comunque di specificare il numero di byte. Quindi non hai davvero bisogno dd- questo funzionerebbe:

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

1 gigabyte è in genere 2 30 byte (anche se invece è possibile utilizzare 10**9per 10 9 byte). La * 3/4parte tiene conto del sovraccarico Base64, rendendo l' output codificato 1 GB.

In alternativa, potresti usare /dev/urandom, ma sarebbe un po 'più lento di OpenSSL:

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

Personalmente, vorrei usare bs=64M count=16o simili:

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

2
Ho pubblicato una domanda relativa alla compressione di file di grandi dimensioni su superuser.com/questions/467697/… e mi è stato consigliato che l'utilizzo /dev/urandomgenera un file binario e non un vero file di testo.
PeanutsMonkey,

2
@PeanutsMonkey: Right; avresti bisogno di qualcosa del genere dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt.
Scott,

3
@PeanutsMonkey: non esiste un unico "scenario del mondo reale", alcuni scenari potrebbero avere a che fare con gigabyte di testo, altri - con gigabyte di JPEG o gigabyte di software compilato ... Se vuoi molto testo, scarica un dump di Wikipedia per esempio.
Grawity,

2
@PeanutsMonkey: ddlegge 750.000.000 di byte /dev/urandome li convoglia in uuencode. uuencodecodifica il suo input in una forma di codifica base64 (non necessariamente coerente con altri programmi). In altre parole, questo converte i dati binari in testo. Ho usato 750M perché mi sono fidato dell'affermazione di Grawity secondo cui la codifica base64 espande i dati del 33⅓%, quindi è necessario richiedere ¾ tutti i dati binari che si desidera nel file di testo.
Scott,

3
Nota se dice dd: warning: partial read (33554431 bytes); suggest iflag=fullblockche creerà un file troncato, quindi aggiungi il iflag=fullblockflag, quindi funziona.
rogerdpack,

25

Creare un file di contenuto casuale da 1 GB.bin:

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


3
Per me, è iflag=fullblockstata l'aggiunta necessaria rispetto ad altre risposte.
dojuba,

2

Se si desidera ESATTAMENTE 1 GB, è possibile utilizzare quanto segue:

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

Il comando openssl rende un file esattamente 1 byte troppo grande. Il comando truncate cancella quel byte.


Quel byte extra è probabilmente a causa del -base64. Rimuovendolo si otterrà un file con la dimensione corretta.
Daniel,

-1

Prova questo script.

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

Questo script potrebbe funzionare finché non ti dispiace utilizzarlo /dev/random.

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

8
Non consiglierei di sprecare /dev/randomquesto a meno che non ci sia un ottimo motivo per farlo. /dev/urandomè molto più economico.
Ansgar Wiechers,

1
Inoltre, $var=(command)non è una sintassi valida in questo contesto.
Grawity,

@grawity - Quando dici che non è valido, cosa intendi?
PeanutsMonkey,

Intendo esattamente questo: non è corretto.
Grawity,

3
@grawity, @PeanutsMonkey: ha fatto un refuso; intendeva random=$(openssl rand -base64 1000). Anche se mi chiederei se bashti permetterebbe di assegnare un valore lungo gigabyte a una variabile. E anche se lo dici random=$(openssl rand -base64 1000), il successivo if=$randomnon ha senso.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.