118

Как я могу создать файл (например, с помощью touch команды или другим аналогичным способом), но с определенным размером (например, 14 МБ)?

Вариант использования - для тестирования FTP с различными размерами файлов. Если мы сможем создать файл с определенным размером, будет полезно проверить передачу по FTP и т.д.

7 ответов7

154

Используйте 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 .

99

РЕДАКТИРОВАТЬ: Самый простой способ - это, вероятно, 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. Создайте файл, заполненный \0 с:

    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
21
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

ВНИМАНИЕ! dd будет молча перезаписывать все , на что у вас есть права на запись, если вы укажете это добровольно или случайно. Убедитесь, что вы понимаете dd , например. с чтением dd --help , и вы не облажаете свои командные строки dd, иначе вы можете легко вызвать необратимую потерю данных - даже полную.

Для начала, if= это входной файл, а of= это выходной файл. Всегда проверяйте, что вы правильно поняли, прежде чем запускать команду. :)

13

Используйте волшебный dd человек страница

$ 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 на любое число, которое вам нравится.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .