Как создать файл из терминала, бесконечно повторяя набор слов? Мне нужно создать огромный файл для синтаксического анализа размером 2-4 ГБ. В настоящее время я вручную копирую вставляя строки в один и тот же файл, чтобы увеличить размер.
Я не могу рекомендовать бесконечно повторяющийся текст, но вы могли бы сделать файл с повторяющимся текстом ~ 2 ГБ с помощью python, так ...
python3 -c 'with open("bigfile", "w") as f: f.write(("hello world "*10+"\n")*2*10**7)'
Это будет печатать «привет мир» 10 раз и введите новую строку и повторите это 20 000 000 раз, записывая результат в файл bigfile. Если все ваши символы ASCII, то каждый из них один байт, поэтому рассчитывайте соответственно в зависимости от того, что вы хотите записать ...
Возможно, ваш процессор. У меня заканчивается RAM, если я пытаюсь выполнить более 10 000 000 строк ...
Я запускаю тостер, хотя
Perl имеет отличный x оператор:
$ perl -e 'print "foo\n" x 5'
foo
foo
foo
foo
foo
Итак, в качестве простого решения вы можете просто написать свою строку несколько миллионов раз. Например, эта команда создала файл 3G:
perl -e 'print "This is my line\n" x 200000000' > file
Если вам нужно указать точный размер (в этом случае 2 гигабайта), вы можете сделать:
perl -e 'use bytes; while(length($str)<2<<20){ $str.="This is my line\n"} print "$str\n"' > file
stat -c '%s' source.txt
Определить размер целевого файла, например. destination.txt, 2 ГБ или 4 ГБ или что-то еще. Преобразование размера в байтах. Разделите размер файла назначения по размеру исходного файла. bash не может выполнять арифметику с плавающей запятой, но в этом случае она не нужна. Используйте конструкцию for, чтобы повторить операцию cat source.txt с моментами деления. Это будет ближайший приблизительный размер файла назначения, который вы можете получить путем повторения. Выход операции сохраняется в destination.txt. Например, если source.txt имеет 30 байт, и мы хотим создать файл размером 2 ГБ, нам нужно:
for ((i=0; i<=((16777216/30)); i++)); do cat source.txt; done >destination.txt
Здесь я устанавливаю верхний предел на ((16777216/30)) во время инициализации; вы можете получить результат и поместить его здесь.
Операция займет некоторое время; чем больше значение source.txt, тем меньше времени потребуется.
Вы также можете использовать while -loop.
Пример: Содержимое foo.txt (это ваш источник):
foo
bar
foobar
bar.txt пуст (Это ваш целевой файл). Вы можете теперь rn следующего цикла, чтобы записать содержимое foo.txt несколько раз в bar.txt:
while [ $(stat --format "%s" bar.txt) -lt 150 ]
do
cat foo.txt >> bar.txt
done
Объяснение:
stat --format "%s" bar.txt отображает размер bar.txt ] в байтах. while [ $(stat --format "%s" bar.txt) -lt 150 ] следующие действия будут повторяться до достижения целевого размера (в данном случае 150 байт). cat foo.txt >> bar.txt добавьте содержимое foo.txt в bar.txtсначала из команды fire:
dd if=/dev/urandom of=file.txt bs=2048 count=10
создаст файл на пути к размеру bs * count случайных байтов, в нашем случае 2048 * 10 = 20Kb. который может быть изменен в соответствии с требованием.
cat - > file.txt
Эти команды перенаправляют STDIN в файл, поэтому вам нужно будет ввести две строки, а затем нажать Ctrl + D. Затем вам нужно будет выполнить следующую команду:
for i in {1..n}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done
Где n - целое число. Это создаст файл с 2 ^ (n + 1) строками в нем, дублируя исходные две строки. Итак, чтобы создать файл с 16 строками, вы бы сделали:
for i in {1..3}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done
Вот еще несколько номеров, которые вы начали:
n=15 will give you 65536 lines (if the original two lines were 'hello' and 'world' the file will be 384Kb)
n=20 will give you 2097152 lines (12Mb file with 'hello' and 'world' as the two starting lines)
n=25 will give you 67108864 lines (384Mb file with 'hello' and 'world' as the two starting lines)
FIFO - это, вероятно, то, что вы ищете. Вместо того, чтобы вызывать вашу программу с данным файлом, вы можете связать с ней результат команды оболочки с помощью подзадачи процесса, и программа увидит его вывод как файл открытого текста. Преимущество здесь в том, что вы больше не ограничены дисковым пространством, поэтому вы можете достигнуть файлов, которые были бы невозможны в противном случае, если вашей программе не нужно сначала буферизовать весь файл и просто анализировать ее по строкам. Например, используя ответ @hobbs для генерации контента:
wc -c <(yes we have no bananas | head -n 5000000000)
Это дает мне 95-гигабайтный файл (в соответствии с wc) без каких-либо затрат на место на жестком диске и практически без ОЗУ, команда возвращается до того, как будет прочитана. Это примерно так же близко к «бесконечно», как вы собираетесь получить.