Як створити файл із заданим розміром у Linux?


157

Для тестування я повинен створити файл певного розміру (щоб перевірити обмеження на завантаження).

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


Відповіді:


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

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


О, це може бути ефективніше, ніж мій підхід, тому що це все в одному блоці. Гарна ідея.
Пол Томблін,

10
Насправді, використання величезного розміру буде набагато гіршим, коли він стане дуже великим, оскільки він виділить та прочитає цю кількість в пам'яті перед написанням. Якщо це щось подібне bs = 4GiB, ви, ймовірно, закінчите своп.
Брайан

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
випадання, здається, добре працює для мене. Він створює файл потрібного розміру.
Ефір Сулемана

5
Це найкраща відповідь на це питання. Урізання / помилка не потребує багато часу, оскільки воно не записує всі блоки файлу. Але, якби ви потім десь завантажували отриманий файл, він би прочитав нулі для всієї справи.
Майк Ендрюс

4
Якщо ви хочете запустити це під OSX, то вам потрібно зробити , це: brew install coreutils. Це додасть г перед командою, так що ви повинні запустити його так: gtruncate -s 10G foo. Сподіваюся, це допомагає!
ДерекЕ

Здається, що це не працює на NTFSперегородці.
eloyesp

40

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

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

Це створить файл із «діркою» у ньому на більшості уніксесів - дані насправді не записуються на диск, або не займуть місця, поки в нього не буде записано щось інше, ніж нуль.


Встановлення кількості = 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.
користувач535673

Неправильно: Це створює 10- гігабайтний файл (= ~ 10,7 ГБ).
десерт

20

Використовуйте цю команду:

dd, якщо = $ INPUT-FILE = $ OUTPUT-FILE bs = $ BLOCK-SIZE count = $ NUM-BLOCKS

Щоб створити великий (порожній) файл, встановіть $INPUT-FILE=/dev/zero.
Загальний розмір файлу буде $BLOCK-SIZE * $NUM-BLOCKS.
Буде створений новий файл $OUTPUT-FILE.


Чому ви поставили запитання?
Генріх Б

9
Мені довелося відповісти Google, тому я поставив його тут, щоб його можна було обговорити і оновлювати ... ви знаєте, точка всього сайту?
Grundlefleck

2
Я знаю, що люди голосують @Grundlefleck за відбиття XP, але у нього є пункт - один із способів використовувати цей сайт, як передбачали Джефф і Джоел, - це поставити питання і відповісти на те, що ви щойно відкрили.
Пол Томблін

3
Спасибі Пол. Хоча я не так переймаюся питаннями, мене турбують речі, які я знаходжу в Google, які можуть бути дефектом, про які я ніколи не дізнаюся, якщо не запитав тут. Люди повинні почувати себе вільними, щоб зробити мою спільноту Q / Community, якщо вони думають, що я б'юсь, знизуючи плечима .
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, 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.


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.