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


157

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

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


Ответы:


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.


Почему вы задали вопрос?
— Генри Б.

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.


3

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

base64 /dev/urandom | head -c 4000000 > 4mb.txt

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.