Как создать файл из терминального повторения ряд слов бесконечно? Мне нужен он для создания огромного файла для парсинга целей как 2-4GB в размере. В настоящее время я вручную копирую строки вставки в тот же файл для увеличения размера.
Существует простой способ повторить строку много времен:
yes we have no bananas | head -n 10000 > out.txt
приведет к out.txt, содержащему 10 000 строк все высказывание, "у нас нет бананов".
<час> Для ограничения вывода точным числом байтов используйте head
-c
опция вместо -n
. Например, это генерирует точно 10 КБ текста:
yes we have no bananas | head -c 10000 > out.txt
Я не могу рекомендовать бесконечно повторяющийся текст, но Вы могли сделать ~2GB файл повторного текста с Python как так...
python3 -c 'with open("bigfile", "w") as f: f.write(("hello world "*10+"\n")*2*10**7)'
, Который распечатает "привет мир" 10 раз и сделает новую строку и повторит что 20,000,000 раз, пишущий результат в файл bigfile
. Если всеми Вашими символами является ASCII, то каждый - один байт, поэтому вычислите соответственно в зависимости от того, что Вы хотите записать...
Ваш CPU может принадлежать. У меня заканчивается 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
сначала огня команда:
dd if=/dev/urandom of=file.txt bs=2048 count=10
создаст файл на пути размера bs*count случайные байты, в нашем случае 2048*10 = 20 КБ, которые могут быть изменены согласно требованию.
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)
FIFOs, вероятно, что Вы ищете. Вместо того, чтобы назвать Вашу программу с данным файлом, можно связать результат команды оболочки к нему через , замена процесса и программа будет рассматривать свой вывод как файл простого текста. Преимущество здесь состоит в том, что Вы больше не ограничиваетесь Вашим дисковым пространством, таким образом, можно достигнуть размеров файла, которые были бы невозможны иначе, пока программа не должна буферизовать весь файл сначала и может просто проанализировать его линию за линией. Например, использование @hobbs' отвечает для генерации содержания:
wc -c <(yes we have no bananas | head -n 5000000000)
Это предоставляет мне файл на 95 гигабайтов (согласно туалету) бесплатно в пространстве жесткого диска и едва любой RAM, как раз для буферизации то, что возвращает команда, прежде чем это будет считано. Это о как близко к "бесконечно", когда Вы собираетесь добраться.
Поместите набор слов, которые будут повторены в файле, например. source.txt
. Получите размер source.txt
, в байтах, например:
stat -c '%s' source.txt
Решите размер целевого файла, например. destination.txt
, 2 ГБ или 4 ГБ или что бы то ни было. Преобразуйте размер в байтах.
Разделите целевой размер файла на исходный размер файла. bash
не может сделать арифметики с плавающей точкой, но это не нужно в этом случае.
Используйте a for
создайте для повторения a 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
, меньше времени будет необходимо.
Можно также использовать a while
- цикл.
Пример: содержание 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