Как создать файл из терминала, который бесконечно повторяет набор слов?

19

Как создать файл из терминала, который бесконечно повторяет набор слов? Мне нужно создать огромный файл для синтаксического анализа размером 2-4 ГБ. В настоящее время я вручную копирую вставку строк в один и тот же файл, чтобы увеличить размер.

    
задан Nisheet 27.09.2016 в 05:55
источник

7 ответов

49

Есть простой способ повторить строку много раз:

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
    
ответ дан hobbs 27.09.2016 в 07:53
источник
10

Я не могу рекомендовать повторяющийся текст бесконечно , но вы могли бы сделать файл с повторяющимся текстом ~ 2 ГБ с помощью python, так ...

python3 -c 'with open("bigfile", "w") as f: f.write(("hello world "*10+"\n")*2*10**7)'

Это напечатает «hello world» 10 раз и создаст новую строку и повторит это 20 000 000 раз, записав результат в файл bigfile . Если все ваши символы ASCII, то каждый из них один байт, поэтому рассчитывайте соответственно в зависимости от того, что вы хотите написать ...

Ваш процессор может принадлежать. У меня заканчивается RAM, если я пытаюсь выполнить более 10 000 000 строк ...

Я запускаю тостер, но

    
ответ дан Zanna 27.09.2016 в 06:21
9

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
    
ответ дан terdon 27.09.2016 в 10:42
7
  • Поместите набор слов, которые нужно повторить в файле, например. %код%. Получите размер source.txt , в байтах, например. по:

     stat -c '%s' source.txt
    
  • Определите размер целевого файла, например. source.txt , 2 ГБ или 4 ГБ или что-то еще. Преобразование размера в байтах.

  • Разделите размер файла назначения по размеру исходного файла. destination.txt не может выполнять арифметику с плавающей запятой, но в этом случае она не нужна.

  • Используйте конструкцию bash , чтобы повторить операцию for с результатами разделения. Это будет ближайший приблизительный размер файла назначения, который вы можете получить путем повторения. Результат операции сохраняется в cat source.txt .

Например, если destination.txt имеет 30 байт, и мы хотим создать файл размером 2 ГБ, нам нужно:

for ((i=0; i<=((16777216/30)); i++)); do cat source.txt; done >destination.txt

Здесь я устанавливаю верхний предел на source.txt во время инициализации; вы можете получить результат и поместить его здесь тоже.

Операция займет некоторое время; чем больше ((16777216/30)) , тем меньше времени потребуется.

    
ответ дан heemayl 27.09.2016 в 06:25
6

Вы также можете использовать 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
ответ дан Wayne_Yux 27.09.2016 в 07:52
4

сначала выполните команду пожарной команды:

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)
    
ответ дан Avani badheka 27.09.2016 в 06:22
3

FIFO - это, вероятно, то, что вы ищете. Вместо вызова вашей программы с данным файлом вы можете связать с ней результат команды оболочки через процесс зачета , и программа увидит его вывод как файл открытого текста. Преимущество здесь в том, что вы больше не ограничены дисковым пространством, поэтому вы можете достигнуть файлов, которые были бы невозможны в противном случае, если вашей программе не нужно сначала буферизовать весь файл и просто анализировать ее по строкам. Например, используя ответ @hobbs для создания контента:

wc -c <(yes we have no bananas | head -n 5000000000)

Это дает мне 95-гигабайтный файл (в соответствии с wc) без каких-либо затрат на место на жестком диске и практически без ОЗУ, достаточно, чтобы буферировать то, что возвращает команда, прежде чем она будет прочитана. Это примерно так же близко к «бесконечно», как вы собираетесь получить.

    
ответ дан Santo Guevarra 28.09.2016 в 17:35