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

157

В целях тестирования мне нужно сгенерировать файл определенного размера (чтобы проверить лимит загрузки).

Что такое команда для создания файла определенного размера в Linux?

Grundlefleck
источник
большой размер stackoverflow.com/ru/questions/257844/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

187
dd if=/dev/zero of=upload_test bs=file_size count=1

Где file_sizeразмер вашего тестового файла в байтах

Илья Кочетов
источник
О, это может быть более эффективным, чем мой подход, потому что он делает все это в одном блоке. Отличная идея.
Пол Томблин
10
На самом деле, использование огромного размера блока будет работать намного хуже, когда он станет очень большим, поскольку он будет выделять и считывать это количество в память перед записью. Если это что-то вроде bs = 4 ГБ, вы, вероятно, в конечном итоге поменяетесь.
Брайан
35
ddимеет предел 2 ^ 32 для его значений, так , чтобы создать файл размером более 4 Гб, есть одна хитрость: dd if=/dev/zero of=test bs=1M count=<size in megabytes>.
Дмитрий Сиренко
2
Смотрите следующий ответ для лучшего, более быстрого подхода
элегантные кости
2
@elegantdice не ясно, какой ответ следующий, они могут изменить свою позицию
vladkras
160

Пожалуйста, современнее проще и быстрее. В Linux (выберите один)

truncate -s 10G foo
fallocate -l 5G bar

Это необходимо , чтобы сказать , что truncateв файловой системе , поддерживающие разреженные файлы будут создать разреженный файл и fallocateне будут. Разреженный файл - это файл, в котором единицы выделения, составляющие файл, фактически не выделяются до использования. Метаданные для файла , однако, будут занимать некоторое значительное пространство, но, вероятно, не где-то рядом с фактическим размером файла. Вам следует обратиться к ресурсам о разреженных файлах для получения дополнительной информации, поскольку у этого типа файлов есть свои преимущества и недостатки. Не разреженный файл имеет свои блоки (единицы размещения), выделенные заранее, что означает, что пространство зарезервировано настолько, насколько его видит файловая система. Также fallocateни truncateне будет устанавливать содержимое файла в указанное значение, как ddвместо этого содержимое файла, выделенного с fallocateили truncateможет быть любым значением корзины, которое существовало в выделенных единицах во время создания, и такое поведение может быть или не быть желательным. Это ddсамый медленный способ, потому что он фактически записывает значение или порцию данных во весь файловый поток, как указано в параметрах командной строки.

Это поведение может потенциально отличаться - в зависимости от используемой файловой системы и соответствия этой файловой системы какому-либо стандарту или спецификации. Поэтому рекомендуется проводить надлежащие исследования, чтобы убедиться, что используется соответствующий метод.

Йоргенсен
источник
Я попробовал truncate. Это произвело файл нулевого размера, используя синтаксис выше. «Man-страница» для fallocateговорит, что файлы, которые он создает, полны пустых, spaceа не данных. Похоже, что это было бы бесполезно для некоторых ожидаемых случаев, таких как «сколько времени занимает копирование файла 1G».
Марк Стосберг
6
Fallocate, кажется, работает хорошо для меня. Создает файл нужного размера.
Aater Suleman
5
Это лучший ответ на этот вопрос. Truncate / fallocate не занимает много времени, потому что он не записывает все блоки файла. Но, если бы вы затем загрузили получившийся файл куда-нибудь, он прочитал бы нули для всего этого.
Майк Эндрюс
4
Если вы хотите запустить это под OSX, то вам нужно сделать , это: brew install coreutils. Это добавит г перед командой, так что вы должны запустить его так: gtruncate -s 10G foo. Надеюсь это поможет!
DerekE
Кажется, что это не работает на NTFSразделе.
eloyesp
40

Просто чтобы следить за постом Тома , вы также можете использовать dd для создания разреженных файлов:

dd if=/dev/zero of=the_file bs=1 count=0 seek=12345

Это создаст файл с «дырой» в большинстве юниксов - данные на самом деле не будут записываться на диск или занимать место, пока в него не будет записано что-то отличное от нуля.

Брайан
источник
Установка count = 0 избавляет от необходимости вычитать байт из размера файла.
Andrewdotn
3
с count=0, bs * seekстановится размером файла
Jayen
24

На OSX (и Solaris, по-видимому) mkfileкоманда также доступна:

mkfile 10g big_file

Это делает файл размером 10 ГБ с именем "big_file". Нашел этот подход здесь.

Стив
источник
Это полезно для таких ситуаций, как OS X , где truncateи fallocateкоманды не доступны. ddтакже работает, как описано выше, хотя это mдля мегабайт, а не M.
user535673
Неверно: создается файл размером 10 ГБ (= ~ 10,7 ГБ).
десерт
20

Используйте эту команду:

dd if = $ INPUT-FILE of = $ OUTPUT-FILE bs = $ BLOCK-SIZE count = $ NUM-BLOCKS

Чтобы создать большой (пустой) файл, установите $INPUT-FILE=/dev/zero.
Общий размер файла будет $BLOCK-SIZE * $NUM-BLOCKS.
Новый файл будет создан $OUTPUT-FILE.

Grundlefleck
источник
Почему вы задали вопрос?
Генри Б.
9
Для ответа мне пришлось обратиться в Google, поэтому я разместил его здесь, чтобы его можно было обсудить и держать в курсе ... Вы знаете, смысл всего сайта?
Грундлефлек
2
Я знаю, что люди голосуют @Grundlefleck за XP, но у него есть смысл - один из способов использовать этот сайт, как предполагали Джефф и Джоэл, - это задать вопрос и ответить на что-то, что вы только что обнаружили.
Пол Томблин
3
Спасибо, Пол. Хотя меня не очень волнуют вопросы, я беспокоюсь о вещах, которые я нахожу в Google, которые могут быть ошибочными в некотором смысле, о которых я никогда не узнаю, если не спросить здесь. Люди не стесняются сделать мое сообщество Q / A принадлежащим, если они думают, что я болею, пожимает плечами .
Grundlefleck
2
Цитируя часто задаваемые вопросы: «Также прекрасно задавать и отвечать на свой вопрос программирования, но притворяться, что вы находитесь в опасности: сформулируйте это в форме вопроса».
Крейг Ангус
17

Вы можете сделать это программно:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main() {
    int fd = creat("/tmp/foo.txt", 0644);
    ftruncate(fd, SIZE_IN_BYTES);
    close(fd);
    return 0;
}

Такой подход особенно полезен для последующего MMAP файла в память.

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

# du -B1 --apparent-size /tmp/foo.txt

Быть осторожен:

# du /tmp/foo.txt

вероятно, напечатает 0, потому что он выделен как разреженный файл, если поддерживается вашей файловой системой.

см. также: человек 2 открыт и человек 2 урезан

Бенедикт Вальдвогель
источник
10

Вы могли бы сделать:

[dsm@localhost:~]$ perl -e 'print "\0" x 100' > filename.ext

Где вы заменяете 100 на количество байтов, которое вы хотите записать.

ДСМ
источник
И фактический байт заполнения также. Мне нужен "\ xff" и отлично работает. Спасибо! :)
Рэй
10

Некоторые из этих ответов вы используете /dev/zeroв качестве источника ваших данных. Если скорость загрузки в вашей тестовой сети не самая лучшая, если ваше приложение выполняет сжатие, файл, заполненный нулями, сжимается очень хорошо. Используя эту команду для генерации файла

 dd if=/dev/zero of=upload_test bs=10000 count=1

Я мог бы сжать upload_testдо 200 байтов. Таким образом, вы можете оказаться в ситуации, когда вы думаете, что загружаете файл размером 10 КБ, но на самом деле это будет намного меньше.

Я предлагаю использовать /dev/urandomвместо /dev/zero. Я не мог сжать вывод /dev/urandomочень сильно.

Девин
источник
Моя встроенная система не имеет /dev/zero, так /dev/urandomчто хорошо.
Фредрик Гаусс
9
dd if=/dev/zero of=my_file.txt count=12345
Пол Томблин
источник
4
Помните, что размер блока по умолчанию для dd составляет 512 байт, поэтому эта команда создаст файл размером 12345 * 512 байт.
никто не
4

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

Это создаст /tmp/zero_big_data_file.bin заполненный нулями, который имеет размер 20 мегабайт:

    dd if=/dev/zero of=/tmp/zero_big_data_file.bin  bs=1M count=20

Это создаст /tmp/zero_1000bytes_data_file.bin заполненный нулями, который имеет размер 1000 байтов:

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1kB count=1

или

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1000 count=1

  • Во всех примерах bs - это размер блока, а count - это количество блоков.
  • За блоками и байтами могут следовать следующие мультипликативные суффиксы: c = 1, w = 2, b = 512, кБ = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024 и т. Д. Для T, P, E, Z, Y.
BЈовић
источник
3

Как команда оболочки:

< /dev/zero head -c 1048576 >  output
user1772090
источник
3

В результате будет сгенерирован текстовый файл размером 4 МБ со случайными символами в текущем каталоге и его именем «4mb.txt». Вы можете изменить параметры для создания разных размеров и имен.

base64 /dev/urandom | head -c 4000000 > 4mb.txt
Berkay92
источник
0

Используйте, fallocateесли вы не хотите ждать диск.

Пример:

fallocate -l 100G BigFile

Использование:

Usage:
 fallocate [options] <filename>

Preallocate space to, or deallocate space from a file.

Options:
 -c, --collapse-range remove a range from the file
 -d, --dig-holes      detect zeroes and replace with holes
 -i, --insert-range   insert a hole at range, shifting existing data
 -l, --length <num>   length for range operations, in bytes
 -n, --keep-size      maintain the apparent size of the file
 -o, --offset <num>   offset for range operations, in bytes
 -p, --punch-hole     replace a range with a hole (implies -n)
 -z, --zero-range     zero and ensure allocation of a range
 -x, --posix          use posix_fallocate(3) instead of fallocate(2)
 -v, --verbose        verbose mode

 -h, --help           display this help
 -V, --version        display version
цинь
источник