В целях тестирования мне нужно сгенерировать файл определенного размера (чтобы проверить лимит загрузки).
Что такое команда для создания файла определенного размера в Linux?
В целях тестирования мне нужно сгенерировать файл определенного размера (чтобы проверить лимит загрузки).
Что такое команда для создания файла определенного размера в Linux?
Ответы:
dd if=/dev/zero of=upload_test bs=file_size count=1
Где file_size
размер вашего тестового файла в байтах
dd
имеет предел 2 ^ 32 для его значений, так , чтобы создать файл размером более 4 Гб, есть одна хитрость: dd if=/dev/zero of=test bs=1M count=<size in megabytes>
.
Пожалуйста, современнее проще и быстрее. В Linux (выберите один)
truncate -s 10G foo
fallocate -l 5G bar
Это необходимо , чтобы сказать , что truncate
в файловой системе , поддерживающие разреженные файлы будут создать разреженный файл и fallocate
не будут. Разреженный файл - это файл, в котором единицы выделения, составляющие файл, фактически не выделяются до использования. Метаданные для файла , однако, будут занимать некоторое значительное пространство, но, вероятно, не где-то рядом с фактическим размером файла. Вам следует обратиться к ресурсам о разреженных файлах для получения дополнительной информации, поскольку у этого типа файлов есть свои преимущества и недостатки. Не разреженный файл имеет свои блоки (единицы размещения), выделенные заранее, что означает, что пространство зарезервировано настолько, насколько его видит файловая система. Также fallocate
ни truncate
не будет устанавливать содержимое файла в указанное значение, как dd
вместо этого содержимое файла, выделенного с fallocate
или truncate
может быть любым значением корзины, которое существовало в выделенных единицах во время создания, и такое поведение может быть или не быть желательным. Это dd
самый медленный способ, потому что он фактически записывает значение или порцию данных во весь файловый поток, как указано в параметрах командной строки.
Это поведение может потенциально отличаться - в зависимости от используемой файловой системы и соответствия этой файловой системы какому-либо стандарту или спецификации. Поэтому рекомендуется проводить надлежащие исследования, чтобы убедиться, что используется соответствующий метод.
truncate
. Это произвело файл нулевого размера, используя синтаксис выше. «Man-страница» для fallocate
говорит, что файлы, которые он создает, полны пустых, space
а не данных. Похоже, что это было бы бесполезно для некоторых ожидаемых случаев, таких как «сколько времени занимает копирование файла 1G».
brew install coreutils
. Это добавит г перед командой, так что вы должны запустить его так: gtruncate -s 10G foo
. Надеюсь это поможет!
NTFS
разделе.
Просто чтобы следить за постом Тома , вы также можете использовать dd для создания разреженных файлов:
dd if=/dev/zero of=the_file bs=1 count=0 seek=12345
Это создаст файл с «дырой» в большинстве юниксов - данные на самом деле не будут записываться на диск или занимать место, пока в него не будет записано что-то отличное от нуля.
count=0
, bs * seek
становится размером файла
На OSX (и Solaris, по-видимому) mkfile
команда также доступна:
mkfile 10g big_file
Это делает файл размером 10 ГБ с именем "big_file". Нашел этот подход здесь.
truncate
и fallocate
команды не доступны. dd
также работает, как описано выше, хотя это m
для мегабайт, а не M
.
Используйте эту команду:
dd if = $ INPUT-FILE of = $ OUTPUT-FILE bs = $ BLOCK-SIZE count = $ NUM-BLOCKS
Чтобы создать большой (пустой) файл, установите $INPUT-FILE=/dev/zero
.
Общий размер файла будет $BLOCK-SIZE * $NUM-BLOCKS
.
Новый файл будет создан $OUTPUT-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;
}
Такой подход особенно полезен для последующего MMAP файла в память.
используйте следующую команду, чтобы убедиться, что файл имеет правильный размер:
# 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
очень сильно.
/dev/zero
, так /dev/urandom
что хорошо.
dd if=/dev/zero of=my_file.txt count=12345
Есть много ответов, но никто не объяснил, что еще можно сделать. Просматривая справочные страницы для 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
Как команда оболочки:
< /dev/zero head -c 1048576 > output
Используйте, 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