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

17

Я нашел способ сделать это в Windows

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

Есть ли способ в UNIX скопировать файл, добавить, а затем повторить процесс? Что то типа for .. cat file1.txt > file1.txt?

Томас Ли
источник
Зачем копировать файл и добавлять, а не просто добавлять?
123
@ 123 - это хорошо, но как сделать цикл?
Томас Ли
4
for i in {1..1000000};do echo "string" >> file;doneв баш.
123
9
Это должен быть текстовый файл? Вы можете создать файл любого размера из / dev / zero или / dev / urandom.
RealSkeptic
2
Я бы ожидал type file >> fileзапустить в бесконечном цикле (по крайней мере, как только он станет достаточно большим, чтобы не помещаться в буфер).
Стефан Шазелас

Ответы:

29
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к выполнению бесконечного цикла, так как это приведет к чтению данных, которые он записал ранее.

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

Стефан Шазелас
источник
19
Или dd if=/dev/zero of=large-file bs=1024 count=1024для файла размером 1
МБ
7
@ DougO'Neal Я нахожу dd if=/dev/zero of=test bs=1M count=1более понятным.
123
1
Или используйте / dev / urandom вместо / dev / zero, если вам нужны случайные данные.
user253751
3
@ robertotomás да, все используют dd, но я никогда не понимал, почему. На самом деле, я думаю, что когда-либо использовал его только для чтения MBR или подобных дополнительных задач. По моему опыту, другие инструменты быстрее, проще и безопаснее для подавляющего большинства случаев, когда люди используют dd. Я думаю, что это один из тех случаев, когда часто! = Оптимальный, как sudo suили cat file | grep foo.
Тердон
22

Вы можете создать большой файл в 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
Ламберт
источник
дд один, как терабайт
123
1
Определите «большой файл» :-) Но я отредактировал, так как все остальные образцы указывают 10g ...
Ламберт
truncate Невозможно выполнить 'truncate'. Нет такого файла или каталога Truncate, кажется, только для Linux.
Шили
truncateсуществует в Солярисе 11.2+
Ламберт
11

Самый быстрый способ создать большой файл в системе 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).

Руи Ф Рибейро
источник
1
Это должен быть принятый ответ. Легко и быстро.
ardochhigh
8

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

yes This is stuff that I want to put into my file... >> dummy.txt

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

От man yes:

yes - output a string repeatedly until killed
Вопросительный знак
источник
Это очень простой способ создать большой файл в среде Linux.
Чаминда Бандара
1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtпозволит вам получить точную сумму. (-n $ TARGET_NUMBER_OF_LINES). yesбудет автоматически умирать в результате «сломанной трубы», когда headзавершится, потому что целевое число было достигнуто.
PypeBros
4

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

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
Тердон
источник
1
Есть ли catу файла какое-то преимущество перед простым добавлением? Казалось бы, это заняло бы больше времени, так как пришлось бы обрабатывать два процесса в каждом цикле, а также перемещать все содержимое несколько раз.
123
1
@ 123 скорости. catПодход намного быстрее. Это имеет смысл только для создания огромных файлов, но это создало файл 545M за 10 секунд на моей машине. Тот же whileцикл с echo "test line" >> fileсозданием файла 96K за то же время.
Terdon
Я думаю, что с подходом "кошка" это то, что он растет в геометрической прогрессии. При запуске второй итерации «newfile» уже имеет 1 строку, а «file» - 2, а когда это будет сделано, «newfile» теперь будет 3 строками, а «file» - 5. Далее, «newfile» будет 8 и « файл »будет 13. Далее (21, 34) и т. д.
PypeBros
недостаток: он может занять больше места на диске (> = 1,5 * требуемый_размер), чем целевой размер файла при его создании.
PypeBros
Кстати. Если у вас есть truncateвокруг, вы можете truncate -s 1Gсоздать файл в первую очередь. unix.stackexchange.com/a/269184/85549 . Вы можете заменить его на head -c $DESIRED_SIZE, возможно, внутри whileцикла.
PypeBros
3

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

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

Даст вам файл с 100 байтами мусора.

расточитель
источник
1
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, вы не можете объединить файл непосредственно к себе.

MelBurslan
источник
Помимо того .txt, что вы забыли расширение, в конце вы оставляете 2 больших файла.
ot--