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


125

Як я можу створити файл (наприклад, за допомогою touchкоманди чи іншим подібним способом), але із певним розміром (наприклад, 14 МБ)?

Випадком використання є тестування FTP з різними розмірами файлів. Якщо ми можемо створити файл із певним розміром, буде корисно перевірити передачу FTP тощо.


9
Відносяться SO питання: stackoverflow.com/questions/257844 / ...
Der Hochstapler

Відповіді:


158

Використання truncate:

truncate -s 14M filename

Від man truncate:

DESCRIPTION
   Shrink or extend the size of each FILE to the specified size

[...]

 -s, --size=SIZE
          set or adjust the file size by SIZE

Примітка: truncateможливо, недоступна у вашій системі, наприклад, на Mac OS X вона не встановлена ​​за замовчуванням (але ви можете її легко встановити, наприклад, використовуючи макпорти). У цих випадках вам може знадобитися використовувати ddабо headзамість цього.


2
Ого. дуже добре, я цього не знав.
n611x007

людина все це каже: усікає - скорочує або збільшує розмір файлу до вказаного розміру
ssedano

12
Справді дуже приємно. Однак touchце не потрібно, ви можете просто запустити truncate -s 14M filenameйого, створивши filenameбезпосередньо.
тердон

круто ... це те, що я саме шукав ... дякую @ oliver-salzburg
fasil

34
Це, здається, створює розріджений файл , тоді як відповідь нижче (в якій використовується "dd") не відповідає. Я не знаю, чи важлива для вас різниця, але я подумав, що це
зазначу

100

EDIT: Найпростіший спосіб, ймовірно, truncateз Ашутош VISHWA бандха в відповідь , але , як вказував @ offby1 , що створює розріджені файли , які не можуть бути то , що ви хочете. Нижче наведені рішення створюють нормальні повноцінні файли.


Наступні команди створюють файл розміром 14 Мб foo:

  1. fallocate(Завдяки @Breakthrough , який запропонував його в коментарях і голосувати на Ахмеда Масуда відповідь нижче , який також згадує про це.)

    fallocate -l 14000000 foo
    

    Ця команда особливо вражає, оскільки вона настільки ж швидка, як truncate(миттєва), незалежно від потрібного розміру файлу (на відміну від інших рішень, які будуть повільними для великих файлів), але при цьому створює звичайні файли, а не рідкі:

    $ truncate -s 14MB foo1.txt 
    $ fallocate -l 14000000 foo2.txt 
    $ ls -ls foo?.txt 
        0 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:54 foo1.txt
    13672 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:55 foo2.txt
    
  2. Створіть файл, наповнений випадковими даними

    dd if=/dev/urandom of=foo bs=14MB count=1
    

                                                                              або

    head -c 14MB /dev/urandom > foo
    
  3. Створіть файл, заповнений \0s:

    dd if=/dev/zero of=foo.txt bs=14MB count=1
    

                                                                              або

    head -c 14MB /dev/zero > foo
    
  4. Створіть файл, заповнений першими 14 МБ даних іншого файлу:

    head -c 14MB bar.txt > foo
    
  5. Створіть файл, наповнений останніми 14 МБ даних іншого файлу:

    tail -c 14MB bar.txt > foo
    

У всіх перерахованих вище прикладах файл буде, 14*1000*1000якщо ви хочете 14*1024*1024, замінити MBна M. Наприклад:

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo

fallocate торгує лише в байтах, тому вам доведеться робити (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo

2
Дякую ... Це також відповідає моїй меті створити файл потрібного розміру ...
fasil

2
Я б рекомендував не використовувати, ddякщо існує простіший, менш потенційно-руйнівний підхід.
аколіт

3
@acolyte так би і я. Тому кожне ddрішення має альтернативу, яка не належить до DD.
тердон

1
Запис у вікі говорить, що навіть DD (із нулями) створить розріджений файл, чи не так? en.wikipedia.org/wiki/Sparse_file
Майкл

1
@Michael Я перевірив, щоб бути впевненим, і жодна з моїх команд не створює розріджених файлів. ddКоманда на вікі - сторінці зовсім інша і не використовує /dev/zero. Що стосується того, Mчи MBбільш логічно це, візьміть це на розгляд розробникам. На сторінках із головою , хвостом та дд все чітко зазначено, що "MB = 1000 * 1000, M = 1024 * 1024". Це може відрізнятись від інших * нікс.
тердон

21
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

ПОПЕРЕДЖЕННЯ dd мовчки замінить все, на що ви маєте права писати, якщо ви вкажете це чи то охоче, чи випадково. Переконайтеся, що ви розумієте dd, наприклад. з читанням dd --help, і ви не накручуєте свої командні рядки dd, інакше ви можете легко створити незворотні втрати даних - навіть тотальні .

Для початку if=- це вхідний файл і of=є вихідний файл . Завжди перевірте, чи правильно ви це зробили, перш ніж запустити команду. :)


13

Використовуйте сторінку магії dd;) man

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336

причина 14MB * 1024 = 14336KB, або:

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14

І ви отримаєте 14mb файл output.dat, заповнений нулями: D


8

Це має бути найшвидший спосіб зробити це:

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 

В іншому випадку просто напишіть швидку і брудну програму C або perl, яка шукає точну позицію і записує один байт. Це ЛОТ швидше, ніж насправді скидання даних на блоки.

Якщо ви хочете , щоб уникнути розріджених файлів , то на Linux (і , можливо , інші системи) , ви можете використовувати fallocate -l <length>з util-linux.

Якщо це недоступно, і у вас є система, сумісна з POSIX, ви можете написати швидку та брудну програму, використовуючи виклик бібліотеки posix_fallocate (). posix_fallocate гарантує розподіл вказаного діапазону, тому ви не отримаєте повний диск при подальшому використанні діапазону, якщо він успішно повернеться


6

Хоча ddце портативний спосіб зробити це, команди mkfileі xfs_mkfileнаписані спеціально для цієї мети і швидше:

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename

Проблема полягає в тому, що жодна команда не є універсальною, тому вони не є гарними для написання портативних сценаріїв. Однак якщо я роблю це інтерактивно через командний рядок, це ті команди, які я використовую.

За замовчуванням вони створюють файли, заповнені нулем, а не розріджені (або "холі") файли . Вони обидва мають -nможливість створити розріджені файли.


1

Є ще один варіант з Perl:

perl -e 'print "a" x 1024' > file.txt

Це створить файл 1 КБ. Замініть 1024 будь-яким номером, яке вам подобається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.