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

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

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

14 ответов

Решение
dd if=/dev/zero of=upload_test bs=file_size count=1

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

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

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

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

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

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

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

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

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

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

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

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

mkfile 10g big_file

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

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

#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;
}

Этот подход особенно полезен для последующего преобразования файла в память.

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

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

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

# du /tmp/foo.txt

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

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

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

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

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

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

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

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

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

Использовать 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
dd if=/dev/zero of=my_file.txt count=12345

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

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

Есть много ответов, но никто не объяснил, что еще можно сделать. Просматривая справочные страницы для 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.

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

< /dev/zero head -c 1048576 >  output

Пожалуйста, запустите приведенную ниже команду для быстрого создания большего файла определенного размера в Linux.

      for i in {1..10};do fallocate -l 2G filename$i;done

Объяснение:-Вышеупомянутая команда создаст 10 файлов размером 10 ГБ всего за несколько секунд.

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