Как создать файл с заданным размером в Linux? - PullRequest
138 голосов
/ 26 сентября 2008

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

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

Ответы [ 12 ]

172 голосов
/ 26 сентября 2008
dd if=/dev/zero of=upload_test bs=file_size count=1

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

147 голосов
/ 03 января 2012

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

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

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

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

40 голосов
/ 26 сентября 2008

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

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

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

20 голосов
/ 03 января 2012

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

mkfile 10g big_file

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

20 голосов
/ 26 сентября 2008

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

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

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

17 голосов
/ 29 октября 2008

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

#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 голосов
/ 16 сентября 2013

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

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

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

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

10 голосов
/ 26 сентября 2008

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

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

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

9 голосов
/ 26 сентября 2008
dd if=/dev/zero of=my_file.txt count=12345
3 голосов
/ 21 июля 2016

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

base64 /dev/urandom | head -c 4000000 > 4mb.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...