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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

#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, поскольку он выделяется разреженный файл, если поддерживается вашей файловой системой.

см. также: man 2 open и man 2 truncate

Ответ 6

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

mkfile 10g big_file

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

Ответ 7

dd if=/dev/zero of=my_file.txt count=12345

Ответ 8

вы можете сделать:

[[email protected]:~]$ perl -e 'print "\0" x 100' > filename.ext

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

Ответ 9

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

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

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

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

Ответ 10

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

< /dev/zero head -c 1048576 >  output

Ответ 11

Есть много ответов, но никто не объяснил, что еще можно сделать. Заглядывая в man-страницы для 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 - количество блоков
  • В BLOCKS и BYTES могут следовать следующие мультипликативные суффиксы: c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024 и т.д. Для T, P, E, Z, Y.

Ответ 12

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

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

Ответ 13

Я полагаю, что наиболее эффективный подход предполагает создание файла с использованием open (с флагами O_CREAT и O_WRONLY, если вы не хотите читать из файла в той же программе) и установить размер с помощью ftruncate.