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


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

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


114
2018-06-18 11:14


Источник


Связанный вопрос SO: stackoverflow.com/questions/257844/... - Der Hochstapler


Ответы:


использование 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 вместо.


148
2018-06-18 11:26



Вау. Очень приятно, я этого не знал. - n611x007
человек говорит все: truncate - сжатие или расширение размера файла до указанного размера - ssedano
Очень хорошо. touch не требуется, но вы можете просто запустить truncate -s 14M filename это создаст filename непосредственно. - terdon
круто ... это то, что я точно искал ... спасибо @ oliver-salzburg - fasil
Кажется, это создает разреженный файл, тогда как ниже ответ (который использует «dd»), нет. Я не знаю, важна ли разница для вас, но я подумал, что я бы указал на это - offby1


РЕДАКТИРОВАТЬ: Самый простой способ - это, вероятно, truncate Ашутоша Вишва Бандху ответ, но, как указано @ offby1 что создает редкие файлы которые могут быть не такими, какие вы хотите. Нижеприведенные решения создают нормальные, полные файлы.


Следующие команды создают 14 МБ-файл, называемый foo:

  1. fallocate (благодаря @Прорвать который предложил его в комментариях и проголосовал за Ахмеда Масуда ответ ниже которого также упоминается об этом.)

    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

95
2018-06-18 11:23



Спасибо ... Это также будет соответствовать моей цели создания файла желаемого размера ... - fasil
я бы рекомендовал против использования dd если есть более простой, менее потенциально разрушительный подход. - acolyte
@acolyte, так и я. Поэтому каждый dd решение имеет альтернативу non-dd. - terdon
В записи wiki говорится, что даже dd (с нулями) создаст разреженный файл, не так ли? en.wikipedia.org/wiki/Sparse_file - Michael
@Michael Я проверил, просто, чтобы убедиться, и ни одна из моих команд не производит разреженные файлы. dd команда на странице вики совершенно другая и не использует /dev/zero, Что касается того, M или MB является более логичным, возьмите его с разработчиками. Страницы руководства глава, хвост а также дд все четко указывают, что «MB = 1000 * 1000, M = 1024 * 1024». Это может отличаться от других * nixes. - terdon


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

ПРЕДУПРЕЖДЕНИЕ  dd будет молча перезаписывать что-нибудь у вас есть права на запись, если вы укажете его либо добровольно, либо случайно. Убедитесь, что вы понимаете dd, например. с чтением dd --help, и вы не испортите свои командные строки dd, иначе вы можете легко создать необратимую потерю данных - даже общий,

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


21
2018-06-18 11:23





Использовать магию 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

И вы получите файл 14mb output.dat, заполненный нулями: D


13
2018-06-18 11:20





Это должен быть самый быстрый способ сделать это:

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 гарантирует выделение указанного диапазона, поэтому вы не получите полного заполнения диска при последующем использовании диапазона, если он успешно вернется


8
2018-06-19 04:05





В то время как dd это переносимый способ сделать это, команды mkfile а также xfs_mkfile написаны специально для этой цели и быстрее:

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

Ловушка заключается в том, что ни одна из команд не является общедоступной, поэтому они не подходят для написания переносимых скриптов. Однако, если я делаю это интерактивно через командную строку, это те команды, которые я использую.

По умолчанию создайте ненулевые файлы с нулевым заполнением. Они оба принимают -n вместо этого можно создать дырявые файлы.


5
2018-06-20 04:59





Существует еще один вариант с Perl:

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

Это создаст файл 1 КБ. Замените 1024 любым количеством, которое вам нравится.


1
2017-12-11 20:00