Як створити файл з терміналу, що нескінченно повторює набір слів?


19

Як створити файл з терміналу, що нескінченно повторює набір слів? Мені це потрібно для створення величезного файлу для розбору цілей розміром 2-4 ГБ. Наразі я вручну копіюю вставляючі рядки в один і той же файл, щоб збільшити розмір.


1
Я хотів би побачити відповідь, що працює зі спеціальними файлами unix, тому він фактично не займає це місце. Це можливо?
Деліссон Хуніо

1
Ви маєте на увазі щось справді нескінченне, як mkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; done?
Болдевін

Відповіді:


50

Існує простий спосіб повторити рядок багато разів:

yes we have no bananas | head -n 10000 > out.txt

в результаті вийде out.txt, що містить 10000 рядків, у яких все написано: "Бананів у нас немає"


Для того, щоб обмежити висновок точне число байтів, використовуйте head«s -cваріант замість -n. Наприклад, це генерує рівно 10 кБ тексту:

yes we have no bananas | head -c 10000 > out.txt

2
ОП хоче мати справу з байтами, а не рядками.
heemayl

4
Щоб вказати ліміт у байтах, просто використовуйте head -c 1000010 кБ замість head -n 1000010 К рядків.
Байт-командир

@ByteCommander так, але це не завадить відрізати результат посередині рядка. Оскільки розмір не повинен бути точним, я б просто визначила кількість ліній, щоб отримати потрібний розмір, і округлити :)
hobbs

1
Я згоден, але я не впевнений, чи це теж буде проблемою. ОП не вказав, який метод він хоче, але у вашій відповіді все ще є обидва. О, і вдячність за подвоєння вашої репутації сьогодні :)
Байт командир

@ByteCommander так, справедливо.
варення

10

Я не можу порекомендувати нескінченно повторюваний текст, але ви можете зробити ~ 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, то кожен з них - один байт, тому обчисліть відповідним чином залежно від того, що ви хочете написати ...

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

Хоча я тостер


ОП хоче мати справу з байтами, а не рядками.
heemayl

@heemayl, звичайно, ваша відповідь краще, але я (смутно) пояснив, як обчислити, скільки рядків використовувати, щоб отримати бажані байти, тому я не вважаю, що моя відповідь є абсолютно марною
Zanna

4
@heemayl, чому ти так впевнений, що ОП хоче байтів? Питання по суті говорить про те, що ОП хоче великого файлу. Конкретний розмір дуже розпливчастий (2-4 Гб), тому я дійсно сумніваюся, що на увазі є конкретний ліміт байт.
тердон

1
@heemayl так, але це дуже, дуже невиразно. Я розумію, що ОП просто хоче великий файл і не піклується про точний розмір. Інакше вони дали б розмір замість такого величезного діапазону розмірів.
тердон

1
@cat ikr! <3python <3
Zanna

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

Якщо ви терплячі, ви можете використовувати круті оператори Perl 6, за винятком того, що Perl 6 значно, набагато, набагато повільніше: D
кіт

@cat це справді? Я взагалі не торкнувся 6, але я припустив, що у нього буде просто вся доброта плюс додаткові додатки. Будь-яка ідея, чому це повільніше?
тердон

1
Мій коментар був здебільшого гліб, але я виявив на початку цього року, що Perl 6 досить повільний, порівняно з Python 3, який є канонічно набагато повільніше, ніж Perl 5 (якого я не перевіряв). Робота зосереджена на особливостях та коректності, ще не на ефективності, але вона була зазначена як мета на 2015 рік. Також Perl 6 для мене досить швидкий? .
кіт

(З іншого боку, список особливостей є вражаючим, щонайменше.)
кіт

7
  • Покладіть набір слів, які слід повторити у файлі, наприклад source.txt. Отримайте розмір source.txt, у байтах, наприклад:

     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, тим менше часу знадобиться.


1
Чи не відкривається це та закривається destination.txtодин раз для кожної ітерації циклу?
Відновіть Моніку - ζ--

@hexafraction Duh, фіксований.
heemayl

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

4

Спочатку стріляй команду:

dd if=/dev/urandom of=file.txt bs=2048 count=10

створить файл на шляху розміру bs * підрахунок випадкових байтів, у нашому випадку 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)

2
ОП хоче мати справу з байтами, а не рядками.
heemayl

ОП також підтримує рядок для заповнення файлу. і моя перша команда вже створила файл відповідно до необхідних байтів пам'яті.
Avani badheka

@heemayl символ нового рядка все ще займає байт, як і попередній коментар. Це законний характер. Тим не менше, в ОП вказуються слова , Avani, тому я не думаю, що ваша / dev / urandom методика відповідає на їх питання.
Майк S

Залежить від / dev / urandom, чи намагаєтеся ви пробувати якісь випадкові байти. Навіть ви можете вибрати власні деякі файли, які містять стільки байтів даних.
Avani badheka

4

FIFO - це, мабуть, те, що ви шукаєте. Замість виклику вашої програми певним файлом ви можете прив’язати до неї результат командної оболонки за допомогою підпункту процесу і програма побачить її вихід у вигляді простого тексту. Перевага тут полягає в тому, що ви більше не обмежені своїм дисковим простором, тож ви можете досягти розмірів файлів, що було б неможливо інакше, доки вашій програмі не потрібно спочатку буферизувати весь файл, а можна просто проаналізувати його по черзі. Наприклад, використовуючи відповідь @hobbs для створення вмісту:

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

Це надає мені файл 95 гігабайт (відповідно до wc) без витрат у просторі на жорсткому диску та ледь не в оперативній пам’яті, достатньо для того, щоб забудувати те, що повертає команда, перш ніж її читати. Це приблизно так само близьке до "нескінченності", як ви збираєтеся отримати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.