Crie muitos arquivos com conteúdo aleatório

23

Estou procurando um comando para criar vários (milhares de) arquivos contendo pelo menos 1 KB de dados aleatórios.

Por exemplo,

Name            size
file1.01        2K
file2.02        3K
file3.03        5K
etc.

Como posso criar muitos arquivos como este?

João José
fonte
O que você quis dizer com "exclusivo"? Não faz sentido no contexto, então você provavelmente usou a palavra errada.
Gilles 'SO- stop be evil'
Eu quis dizer que os arquivos não podem ter o mesmo conteúdo.
João José
Portanto, exclusivo teria significado único.
somehume

Respostas:

25

Como você não tem outros requisitos, algo assim deve funcionar:

#! /bin/bash
for n in {1..1000}; do
    dd if=/dev/urandom of=file$( printf %03d "$n" ).bin bs=1 count=$(( RANDOM + 1024 ))
done

(isso precisa bashpelo menos para {1..1000}).

lcd047
fonte
2
Isso precisa bashpor várias razões, incluindo $((…))e $RANDOM. Mesmo $(…)pode não existir em todos os shell.
G-Man diz 'Restabelecer Monica'
1
@ G-Man, em qualquer caso, nenhuma dessas características são específicas para bashnem eles são originários bash ( {1..1000}vem zsh, for n in...; donee expansão variável vem do shell Bourne, $(...), $((...))e $RANDOM vêm ksh). Os recursos que não são POSIX são {1..1000}, $RANDOMe /dev/urandom.
Stéphane Chazelas
1
Se você queria 1..1000 ser constante de largura que você precisa "%04d"nesse caso, bashou zshpode fazer {0001..1000}semprintf
dave_thompson_085
Recurso adicional: preciso de uma maneira de espalhar esses arquivos por vários subdiretórios aninhados nomeados aleatoriamente.
23418
10

Uma variação de seq, xargs, dde shuf:

seq -w 1 10 | xargs -n1 -I% sh -c 'dd if=/dev/urandom of=file.% bs=$(shuf -i1-10 -n1) count=1024'

Explicação conforme solicitado pelos comentários:

seq -w 1 10imprime uma sequência de números de 01 a 10

xargs -n1 -I%executa o comando sh -c 'dd ... % ...'para cada número de sequência substituindo o % por ele

dd if=/dev/urandom of=file.% bs=$(shuf ...) count=1024cria os arquivos alimentados a partir de / dev / urandom com 1024 blocos com um tamanho de bloco de

shuf -i1-10 -n1um valor aleatório de 1 a 10

FloHimself
fonte
O que isso faz exatamente?
saruftw
1
@ saru95 explicação adicionada.
precisa saber é o seguinte
Isso cria 10 arquivos com tamanho aleatório. Mude "10" para o número de arquivos desejados.
Nay
2

Você pode fazer algo assim:

#!/bin/bash
filecount=0
while [ $filecount -lt 10000 ] ; do
    filesize=$RANDOM
    filesize=$(($filesize+1024))
    base64 /dev/urandom | 
    head -c "$filesize" > /tmp/file${filecount}.$RANDOM
    ((filecount++))
done
rahul
fonte
Eu tentei fazer isso, mas não funcionou. Você pode explicar os parâmetros. :)
João José
muito rápido thx @rahul
BG Bruno
2

Isso usa um único pipeline e parece bastante rápido, mas tem a limitação de que todos os arquivos têm o mesmo tamanho

dd if=/dev/urandom bs=1024 count=10240 | split -a 4 -b 1k - file.

Explicação: Use dd para criar 10240 * 1024 bytes de dados; divida isso em 10240 arquivos separados de 1k cada (os nomes serão executados de 'file.aaaa' até 'file.zzzz')

Ed Randall
fonte