Как я могу создать файл с определенным размером из командной строки?


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 он не установлен по умолчанию (но вы можете легко установить его, например, с помощью macports). В этих случаях вам может понадобиться использовать ddили headвместо.


2
Ух ты. очень мило, я этого не знал
n611x007

Человек говорит все: truncate - сжимает или расширяет размер файла до указанного размера
ssedano

12
Очень мило на самом деле. Это touchне нужно, хотя, вы можете просто запустить truncate -s 14M filenameего создаст filenameнапрямую.
тердон

круто ... это то, что я точно искал ... спасибо @ oliver-
salzburg

34
Кажется, что это создает разреженный файл , а ответ ниже (который использует «dd») - нет. Я не знаю, если разница важна для вас, но я решил, что
укажу на

100

РЕДАКТИРОВАТЬ: Самый простой способ - это, вероятно truncate, ответ Ашутоша Вишвы Бандху , но, как указал @ 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.
Terdon

1
В вики сказано, что даже dd (с нулями) создаст разреженный файл, не так ли? en.wikipedia.org/wiki/Sparse_file
Майкл

1
@ Майкл Я проверил, просто чтобы быть уверенным, и ни одна из моих команд не производит разреженных файлов. Команда ddна вики-странице совершенно другая и не используется /dev/zero. Что касается того , Mили MBболее логично, возьмите его с разработчиками. На страницах руководства head , tail и dd четко указано, что «MB = 1000 * 1000, M = 1024 * 1024». Это может отличаться на других * nixes.
Тердон

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

И вы получите 14 МБ файл 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.