Как создать случайный файл размером 1 ГБ в Linux?

89

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

PeanutsMonkey
источник

Ответы:

131

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
grawity
источник
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 if = / dev / urandom of = 1GB.bin bs = 64M count = 16 iflag = fullblock

anneb
источник
3
Для меня это iflag=fullblockбыло необходимым дополнением по сравнению с другими ответами.
дожюба
2

Если вы хотите точно 1 ГБ, то вы можете использовать следующее:

openssl rand -out $ testfile -base64 792917038; truncate -s-1 $ testfile

Команда 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намного дешевле.
Ансгар Вичерс
1
Кроме того, $var=(command)недопустимый синтаксис в этом контексте.
благодарность
@ Grawity - Когда вы говорите, что это не правильно, что вы имеете в виду?
PeanutsMonkey
Я имею в виду именно это - это неправильно.
Гравитация
3
@grawity, @PeanutsMonkey: он сделал опечатку; он имел в виду random=$(openssl rand -base64 1000). Хотя я хотел бы задать вопрос: bashпозволите ли вы присвоить переменной значение в гигабайтах? И даже если вы говорите random=$(openssl rand -base64 1000), последующее if=$randomне имеет смысла.
Скотт