Создание большого файла с помощью терминала

7

Я хочу сделать файл, который очень большой по размеру для целей тестирования, который должен содержать уникальные слова (строго не повторяющиеся). Это может быть в GB, TB и т. Д. Могу ли я это сделать с терминалом?

Я использую Ubuntu 16.04 (Xenial Xerus).

    
задан Avani badheka 05.11.2016 в 08:43
источник

5 ответов

12

Создание бесконечного количества слов, гарантированных уникальных

В приведенном ниже скрипте будут созданы гарантированные уникальные слова из символов алфавита. Проблема с любой фиксированной длиной символов заключается в том, что она создаст набор ограничений limited , ограничивающий размер вашего файла.

Поэтому я использовал python permutations , что дает (конечное) количество уникальных слов. Однако После использования всех комбинаций мы просто начинаем сначала, печатая слова 2, затем 3, четыре, n раз и т. д., каждое значение для n создаст новое уникальное слово. Таким образом, у нас есть генератор для создания уникальных слов на 100%.

Сценарий:

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

Как использовать

  • Просто скопируйте сценарий в пустой файл, сохраните его как unique_generator.py
  • Запустите его командой:

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

Примечание

Сценарий создает уникальные слова различной длины. Если вы хотите, можно задать начальную или максимальную длину, изменив линии:

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

(замените начало диапазона) и измените:

while True:  

в (например):

while t < 10:   

В последнем случае длина слов не более 10 раз больше, чем алфавит.

Завершение процесса

  • При запуске с терминала просто нажмите Ctrl + C
  • В противном случае:

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

    должен выполнить эту работу.

ответ дан Jacob Vlijm 05.11.2016 в 10:38
источник
6

Чтобы получить большой файл, заполненный случайными словами, используйте следующую команду:

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

Это создаст файл с уникальным словом в каждой строке и строками случайного текста. Вы можете увеличить размер файла, сделав 1000 больше или меньше. Каждый счетчик равен примерно одному байту.

Чтобы сделать пространство слов разделенным, просто передайте их обратно через tr "\n" " " .

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

Это также позволяет избежать проблем производительности, связанных с циклами в оболочке.

    
ответ дан DonyorM 05.11.2016 в 09:15
источник
6

Простейший однострочный шрифт для создания случайных строк символов:

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

или, альтернативно:

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

Для лучшей уникальности вы можете использовать /dev/urandom :

cat /dev/urandom | base64 

Завершите команду с помощью Ctrl + C, когда ваш файл достигнет желаемого размера

Рассмотрим также генераторы случайных строк / паролей :

Таким образом, один из ответов там может быть адаптирован для этого:

while true; do openssl rand -base64 20 ; done

Если вы не хотите использовать знаки и цифры пунктуации, но используйте только буквы, то мы можем использовать tr , чтобы исправить это:

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

Для дополнительной случайности вы можете перетасовать символы сгенерированных строк, используя shuf .

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

И так далее и так далее. Вы даже можете передать вывод другому набору команд base64 или sha256sum , чтобы сделать их еще более случайными.

Для тех, кто любит альтернативные языки, отличные от оболочки, вот однострочный 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)'
    
ответ дан Sergiy Kolodyazhnyy 05.11.2016 в 09:02
источник
3

Если ограниченный алфавит и очень предсказуемый вывод являются точными, следующий, вероятно, самый быстрый (и самый спорный: P) ответ:

seq 100

(если слова могут состоять из простых чисел) или:

seq 100 | tr 0-9 A-I

(если есть желание использовать фактические буквы).

    
ответ дан liori 06.11.2016 в 00:11
источник
3

Вы также можете использовать /proc/sys/kernel/random/uuid в Linux для генерации UUID , который должен быть гарантированно уникальным:

[~]$ 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

Вы можете удалить - символ с tr -d , а затем перенаправить его в файл:

[~]$ for i in {1..10000}; do cat /proc/sys/kernel/random/uuid | tr -d '-' ; done > /tmp/words
[~]$ sort /tmp/words | uniq | wc -l
10000
    
ответ дан Nykakin 06.11.2016 в 12:06
источник

Ознакомьтесь с другими вопросами по меткам