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

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

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

1
задан 5 November 2016 в 15:38

4 ответа

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

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" " "

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

6
ответ дан 23 May 2018 в 04:30
  • 1
    каковы проблемы производительности с циклами на оболочке ? Надеюсь, это не вне темы – Ciprian Tomoiagă 6 November 2016 в 02:13
  • 2
    @CiprianTomoiaga: короткий ответ: нереста новых процессов стоит дорого. Циклы, как в ответе Серга, делают это на каждой итерации, возможно, в несколько раз. Этот ответ повторяет те же процессы, что и вся работа. Для более длительного ответа, пожалуйста, отправьте вопрос на сайт ;-) – liori 6 November 2016 в 04:08

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

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 для исправления этого: [ ! d7]

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: [ ! d10]

python -c $'import string,random;i = [i for i in string.uppercase + string.lowercase + string.digits];\nwhile not random.shuffle(i): print "".join(i)'
6
ответ дан 23 May 2018 в 04:30
  • 1
    да, это может вызвать проблемы. Это может быть случайным, поэтому нет гарантии уникальных слов. – Avani badheka 5 November 2016 в 13:05
  • 2
    Я уже обращался к проблемам уникальности с нескольких точек зрения, ребята, поэтому подумайте об удалении комментариев – Sergiy Kolodyazhnyy 5 November 2016 в 13:20
  • 3
    Технически по-прежнему возможно, что что-то не уникальное, но это маловероятно – DonyorM 5 November 2016 в 13:24
  • 4
    @DonyorM, если вы указываете на пример с переменной $RANDOM, тогда да, но /dev/urandom довольно мала в случайной вероятности, особенно в сочетании с shasum. – Sergiy Kolodyazhnyy 5 November 2016 в 13:26
  • 5
    «довольно низкая случайная вероятность» , , , em, мой лишенный сна мозг означает, что существует низкая вероятность создания неидеальных данных. Но ты получил идею – Sergiy Kolodyazhnyy 5 November 2016 в 13:41

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

seq 100

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

seq 100 | tr 0-9 A-I

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

3
ответ дан 23 May 2018 в 04:30

Вы также можете использовать /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
3
ответ дан 23 May 2018 в 04:30

Другие вопросы по тегам:

Похожие вопросы: