Criando um arquivo grande usando o terminal

7

Eu quero fazer um arquivo que é muito grande em tamanho para fins de teste, que deve conter palavras únicas (estritamente não repetidas). Pode em GB, TB, etc. Posso fazer isso com o terminal?

Estou usando o Ubuntu 16.04 (Xenial Xerus).

    
por Avani badheka 05.11.2016 / 09:43

5 respostas

12

Criando um número infinito de palavras, garantido exclusivo

O script abaixo gerará palavras exclusivas garantidas de caracteres do alfabeto. O problema com qualquer tamanho fixo de caracteres é que ele produzirá um conjunto de possibilidades limitado , limitando o tamanho do seu arquivo.

Por isso, usei python do permutations , que produz um número (finito) de palavras únicas. No entanto Depois de usar todas as combinações, simplesmente recomeçamos, imprimindo as palavras 2, depois 3, quatro, n times etc., cada valor para n criará uma nova palavra única. Assim, temos um gerador para produzir 100% de palavras certamente únicas.

O script:

import itertools
import string

ab = [c for c in string.ascii_lowercase]

t = 1
while True:   
    for n in range(1, len(ab)+1): 
        words = itertools.permutations(ab, n)
        for word in words:
            print(t*("".join(word)))
    t += 1

Como usar

  • Basta copiar o script em um arquivo vazio e salvá-lo como unique_generator.py
  • Execute-o pelo comando:

    python3 /path/to/unique_generator.py > /path/to/bigfile.txt
    

Nota

O script produz palavras únicas de vários comprimentos. Se você quiser, o comprimento inicial ou máximo pode ser definido, alterando as linhas:

for n in range(1, len(ab)+1)

(substitua o início do intervalo) e altere:

while True:  

em (por exemplo):

while t < 10:   

No último caso, o comprimento das palavras é no máximo 10 vezes o alfabeto.

Terminando o processo

  • Ao executá-lo a partir do terminal, basta pressionar Ctrl + C
  • Caso contrário:

    kill $(pgrep -f /path/to/unique_generator.py)
    

    deve fazer o trabalho.

por Jacob Vlijm 05.11.2016 / 11:38
6

Para obter um arquivo grande cheio de palavras aleatórias, use o seguinte comando:

cat /dev/urandom | head -c 1000000 | tr -dc "A-Za-z0-9\n" | sort | uniq

Isso criará um arquivo com uma palavra única em cada linha e strings de texto aleatório. Você pode aumentar o tamanho do arquivo fazendo 1000 maiores ou menores. Cada contagem é igual a aproximadamente um byte.

Para separar o espaço das palavras, simplesmente passe-as de volta por tr "\n" " " .

cat /dev/urandom | head -c 1000000 | tr -dc "A-Za-z0-9\n" | sort | uniq | tr "\n" " "

Isso também evita os problemas de desempenho associados a loops no shell.

    
por DonyorM 05.11.2016 / 10:15
6

Mais simples de uma linha para criar linhas aleatórias de caracteres:

while true; do echo $RANDOM | base64 >> BIGFILE.txt  ; done

ou alternativamente:

while true; do echo $RANDOM | sha512sum  >> BIGFILE.txt ; done   

Para melhor exclusividade, você pode usar /dev/urandom :

cat /dev/urandom | base64 

Finalize o comando com Ctrl + C, quando seu arquivo atingir o tamanho desejado

Considere também geradores aleatórios de strings / senhas :

Assim, uma das respostas pode ser adaptada para ter isto:

while true; do openssl rand -base64 20 ; done

Caso você não queira usar caracteres e números de pontuação, mas use apenas letras, podemos usar tr para corrigir isso:

while true; do openssl rand -base64 20 | tr -d '[[:digit:]][[:punct:]]'  ; done 

Para maior aleatoriedade, você pode misturar os caracteres das strings geradas usando shuf .

while true; do openssl rand -base64 20 | fold -w1 | shuf | tr -d '\n' ; done

E assim por diante e assim por diante. Você pode até passar a saída para outro conjunto de comandos base64 ou sha256sum para torná-los ainda mais aleatórios.

Para quem gosta de idiomas alternativos que não sejam shell, aqui está um one-liner de python:

python -c $'import string,random;i = [i for i in string.uppercase + string.lowercase + string.digits];\nwhile not random.shuffle(i): print "".join(i)'
    
por Sergiy Kolodyazhnyy 05.11.2016 / 10:02
3

Se um alfabeto limitado e uma saída muito previsível estiverem corretos, a resposta a seguir é provavelmente a mais rápida (e mais jogada: P):

seq 100

(se as palavras puderem consistir em apenas números) ou:

seq 100 | tr 0-9 A-I

(se houver o desejo de usar letras reais).

    
por liori 06.11.2016 / 01:11
3

Você também pode usar /proc/sys/kernel/random/uuid no Linux para gerar UUIDs , que devem ser exclusivos:

[~]$ for i in {1..10}; do cat /proc/sys/kernel/random/uuid; done
c8072c40-32f5-4f14-8794-c3ab68e1a0f5
2f2630d8-0e17-4cba-8e62-586ee23f0ebb
97606886-f227-46f6-827a-141b0db57c59
5ffea57c-c3bf-4ba6-8c08-8a1b29ee8f6c
2b90f797-2def-4433-ae71-6f404db944fc
fcb793e9-6102-472d-a7a0-7bf5204dbee5
d84e2877-6804-4bed-85f0-0a551234425a
3d9445ca-335c-4960-83d5-6cb1bef8b9eb
913bce71-5c20-47f7-a22e-277be6856a57
8f232541-f8c1-46ba-b57a-0d11314c3483

Você pode remover o caractere com tr -d e redirecioná-lo para um arquivo:

[~]$ for i in {1..10000}; do cat /proc/sys/kernel/random/uuid | tr -d '-' ; done > /tmp/words
[~]$ sort /tmp/words | uniq | wc -l
10000
    
por Nykakin 06.11.2016 / 13:06