Como crio um arquivo aleatório de 1 GB no Linux?

88

Estou usando o shell bash e gostaria de canalizar o fora do comando openssl rand -base64 1000para o comando ddcomo dd if={output of openssl} of="sample.txt bs=1G count=1. Acho que posso usar variáveis, mas não tenho certeza da melhor maneira de fazê-lo. O motivo pelo qual gostaria de criar o arquivo é porque gostaria de um arquivo de 1 GB com texto aleatório.

AmendoimMacaco
fonte

Respostas:

126

if=não é necessário, você pode canalizar algo em ddvez disso:

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

Não seria útil aqui, pois openssl randrequer especificar o número de bytes de qualquer maneira. Então você realmente não precisa dd- isso funcionaria:

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

1 gigabyte é geralmente 2 30 bytes (embora você possa usar 10**910 9 bytes). A * 3/4peça é responsável pelo overhead da Base64, tornando a saída codificada em 1 GB.

Como alternativa, você poderia usar /dev/urandom, mas seria um pouco mais lento que o OpenSSL:

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

Pessoalmente, eu usaria bs=64M count=16ou semelhante:

dd if=/dev/urandom of=sample.txt bs=64M count=16
gravidade
fonte
2
Publiquei uma pergunta sobre a compactação de arquivos grandes em superuser.com/questions/467697/… e fui informado de que o uso /dev/urandomgera um arquivo binário e não um arquivo de texto verdadeiro.
PeanutsMonkey
2
@PeanutsMonkey: Certo; você precisaria de algo parecido dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt.
Scott
3
@PeanutsMonkey: Não existe um único "cenário do mundo real"; alguns podem estar lidando com gigabytes de texto, outros - com gigabytes de JPEGs ou gigabytes de software compilado ... Se você deseja muito texto, faça o download de um despejo da Wikipedia para exemplo.
grawity
2
@PeanutsMonkey: ddlê 750.000.000 bytes /dev/urandome os canaliza uuencode. uuencodecodifica sua entrada em uma forma de codificação base64 (não necessariamente consistente com outros programas). Em outras palavras, isso converte dados binários em texto. Eu usei o 750M porque confiei na afirmação do grawity de que a codificação base64 expande os dados em 33%, portanto você precisa solicitar quantos dados binários desejar em seu arquivo de texto.
Scott
3
Observe se ele diz dd: warning: partial read (33554431 bytes); suggest iflag=fullblockque criará um arquivo truncado; portanto, adicione o iflag=fullblocksinalizador e funcionará.
Rogerdpack 27/09/19
24

Crie um arquivo de conteúdo aleatório de 1 GB.bin:

dd if = / dev / urandom de = 1GB.bin bs = contagem de 64M = 16 iflag = bloqueio completo

anneb
fonte
3
Para mim, iflag=fullblockfoi a adição necessária comparar com outras respostas.
Dojuba
1

Se você deseja EXATAMENTE 1 GB, poderá usar o seguinte:

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

O comando openssl torna um arquivo exatamente 1 byte muito grande. O comando truncar apara esse byte.

Joel Jacobs
fonte
0

Experimente este script.

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

Esse script pode funcionar desde que você não se importe em usá-lo /dev/random.

#!/bin/bash
dd if=/dev/random of="sample.txt bs=1G count=1"
Jonathan Reno
fonte
8
Eu não recomendaria desperdiçar /dev/randomisso, a menos que haja uma boa razão para fazê-lo. /dev/urandomé muito mais barato.
Ansgar Wiechers
1
Além disso, $var=(command)não é uma sintaxe válida neste contexto.
grawity
@rawity - Quando você diz que não é válido, o que você quer dizer?
PeanutsMonkey
Quero dizer exatamente isso - está incorreto.
grawity
3
@grawity, @PeanutsMonkey: Ele cometeu um erro de digitação; ele quis dizer random=$(openssl rand -base64 1000). Embora eu questionasse se bashpermitiria atribuir um valor de gigabyte de comprimento a uma variável. E mesmo se você disser random=$(openssl rand -base64 1000), o subsequente if=$randomnão faz sentido.
Scott