Як створити випадковий файл 1 Гб в Linux?


88

Я використовую оболонку bash і хотів би передати цю команду openssl rand -base64 1000команді ddтипу, як dd if={output of openssl} of="sample.txt bs=1G count=1. Я думаю, що я можу використовувати змінні, але я не впевнений, як краще це зробити. Причиною, яку я хотів би створити файл, є те, що я хотів би мати 1 ГБ файл із випадковим текстом.

Відповіді:


130

if=не потрібно, ddзамість цього можна щось вставити:

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

Тут це не буде корисно, оскільки openssl randв будь-якому випадку потрібно вказати кількість байтів. Тож вам насправді не потрібно dd- це спрацює:

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

1 гігабайт зазвичай становить 2 30 байт (хоча замість цього ви можете використовувати 10**910 9 байт). На * 3/4частину припадає накладні витрати Base64, що робить кодований вихід 1 Гб.

Можна також скористатися /dev/urandom, але це буде трохи повільніше, ніж OpenSSL:

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

Особисто я б користувався bs=64M count=16чи подібним:

dd if=/dev/urandom of=sample.txt bs=64M count=16

2
Я розмістив запитання щодо стиснення великих файлів на superuser.com/questions/467697/… і мені повідомили, що при використанні /dev/urandomстворюється двійковий файл, а не справжній текстовий файл.
PeanutsMonkey

2
@PeanutsMonkey: правильно; вам знадобиться щось на кшталт dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt.
Скотт

3
@PeanutsMonkey: Не існує єдиного "реального сценарію", деякі сценарії можуть мати справу з гігабайтними текстами, інші - з гігабайтами JPEG або гігабайтми складеного програмного забезпечення ... Якщо ви хочете багато тексту, завантажте дамп у Вікіпедії для приклад.
grawity

2
@PeanutsMonkey: ddзчитується з 750 000 000 байт /dev/urandomі передається в них uuencode. uuencodeкодує свій вхід у форму кодування base64 (не обов'язково узгоджується з іншими програмами). Іншими словами, це перетворює двійкові дані в текст. Я використав 750M, тому що я довіряв твердженням grawity, що кодування base64 розширює дані на 33⅓%, тому вам потрібно запитати в текстовому файлі ¾ стільки бінарних даних, скільки ви хочете.
Скотт

3
Зверніть увагу, якщо він говорить, dd: warning: partial read (33554431 bytes); suggest iflag=fullblockщо створить усічений файл, тому додайте iflag=fullblockпрапор, тоді він працює.
rogerdpack

25

Створіть файл випадкового вмісту 1GB.bin:

dd, якщо = / dev / urandom = 1GB.bin bs = 64M count = 16 iflag = fullblock


3
Для мене iflag=fullblockбуло необхідним доповненням порівняти інші відповіді.
dojuba

2

Якщо ви хочете ВИМОГО 1 ГБ, то ви можете використовувати наступне:

openssl rand -out $ testfile -base64 792917038; усікати -s-1 $ тестовий файл

Команда openssl робить файл рівно на 1 байт занадто великим. Команда обрізання обрізає цей байт.


Цей додатковий байт, можливо, через -base64. Вилучивши його, вийде файл правильного розміру.
Даніель

-1

Спробуйте цей сценарій.

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

Цей сценарій може працювати до тих пір, поки ви не проти використовувати /dev/random.

#!/bin/bash
dd if=/dev/random of="sample.txt bs=1G count=1"

8
Я б не рекомендував витрачати /dev/randomна це, якщо немає дуже вагомих причин для цього. /dev/urandomнабагато дешевше.
Ansgar Wiechers

1
Також $var=(command)в цьому контексті недійсний синтаксис.
grawity

@grawity - Якщо ти кажеш, що це неправда, що ти маєш на увазі?
PeanutsMonkey

Я маю на увазі саме це - це неправильно.
grawity

3
@grawity, @PeanutsMonkey: Він зробив друкарську помилку; він мав на увазі random=$(openssl rand -base64 1000). Хоча я б запитав, чи bashдозволяв би вам призначити змінну, що має величину гігабайт. І навіть якщо ви скажете random=$(openssl rand -base64 1000), наступне if=$randomне має сенсу.
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.