Как создать большой файл в UNIX?

17
13.03.2016, 15:20
7 ответов

Если я правильно вас понял, вы ищете что-то вроде:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

В результате будет создан файл с 22 повторениями «тестовой строки». Если вам нужен файл определенного размера, вы можете использовать что-то вроде этого (в Linux). 1024 - это один килобайт:

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

Лично, когда я хочу создать большой файл, я использую два файла и переключаю один в другой. Вы можете повторять процесс до тех пор, пока не достигнете желаемого размера (здесь 1 МБ):

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

Обратите внимание, что это решение часто превышает желаемый размер, потому что, если размер файла меньше лимита, все будет снова в нем.

Наконец, если все, что вам нужно, это файл желаемого размера и он не должен содержать что-либо, вы можете использовать truncate :

truncate -s 1M file
5
27.01.2020, 19:46

Это будет продолжаться, пока вы не нажмете CTRL-C:

да Это материал, который я хочу поместить в свой файл ... >> dummy.txt

Но будьте осторожны, потому что вы можете получить сотни тысяч строк в секунду ...

От человек да :

yes - output a string repeatedly until killed
10
27.01.2020, 19:46

Вы можете создать большой файл в Solaris, используя:

mkfile 10g /path/to/file

Другой способ, который работает в Solaris (и Linux):

truncate -s 10g /path/to file

Также можно использовать:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240
22
27.01.2020, 19:46

Передав содержимое /dev/urandom в head, вы можете перенаправить вывод в файл, так :

 cat /dev/urandom | head --bytes=100 >> foo.bar

Вы получите файл со 100 байтами мусора.

3
27.01.2020, 19:46
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

Тот же эффект, что и ваш скрипт Windows, но в bash вы не можете напрямую связать файл с самим собой.

1
27.01.2020, 19:46
yes "Some text" | head -n 100000 > large-file

С csh / tcsh :

repeat 10000 echo some test > large-file

С zsh :

{repeat 10000 echo some test} > large-file

В системах GNU см. Также:

seq 100000 > large-file

Или:

truncate -s 10T large-file

(создает Разреженный файл размером 10 ТиБ (очень большой, но не занимает места на диске)) и другие альтернативы, обсуждаемые в «Создать тестовый файл с большим количеством нулевых байтов» .


Выполнение cat file >> file было бы плохой идеей.

Во-первых, он не работает с некоторыми реализациями cat , которые отказываются читать файлы, совпадающие с их выходным файлом. Но даже если вы обойдете это, выполнив cat file | cat >> file , если file больше, чем внутренний буфер cat , это приведет к тому, что cat будет работать в бесконечном цикле, как если бы закончить чтение данных, которые он написал ранее.

В файловых системах, поддерживаемых вращающимся жестким диском, это было бы также довольно неэффективно (после достижения размера, превышающего размер, который мог бы быть кэширован в памяти), так как диск должен был бы перемещаться вперед и назад между местом, где читать данные, и то, куда это писать.

38
27.01.2020, 19:46

Самый быстрый способ создания большого файла в системе Linux - fallocate:

sudo fallocate -l 2G bigfile

fallocate манипулирует файловой системой и по умолчанию не записывает в секторы данных, и поэтому чрезвычайно быстр. Недостатком является то, что его нужно запускать от имени root.

Запуская ее последовательно в цикле, вы можете заполнить самую большую файловую систему за считанные секунды.

Из man fallocate

fallocate используется для манипулирования выделенным дисковым пространством для файла. файла, либо для деаллокации, либо для предварительной аллокации.
Для файловых систем, поддерживающих системный вызов fallocate, предварительное распределение выполняется быстро путем выделения блоков и пометки их как неинициализированных, не требуя ввода-вывода для блоков данных блоков. Это намного быстрее, чем создание файла путем заполнения его нулями.
Поддерживается для XFS (с Linux 2.6.38), ext4 (с Linux 3.0), Btrfs (с Linux 3.7) и tmpfs (с Linux 3.5).

13
27.01.2020, 19:46

Теги

Похожие вопросы