Як створити великий файл в 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

(створює розріджений файл 10TiB (дуже великий, але не займає місця на диску)) та інші альтернативи, обговорювані в "Створення тестового файлу з великою кількістю нульових байтів" .


Робити це cat file >> fileбуло б поганою ідеєю.

По-перше, він не працює з деякими catреалізаціями, які відмовляються читати файли, такі самі, як їх вихідний файл. Але навіть якщо ви обходите це, виконуючи його cat file | cat >> file, якщо fileвін більше, ніж catвнутрішній буфер, це призведе catдо запуску в нескінченному циклі, оскільки це в кінцевому підсумку прочитає дані, написані раніше.

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


19
Або dd if=/dev/zero of=large-file bs=1024 count=1024для файлу 1МБ
doneal24

7
@ DougO'Neal Я вважаю, dd if=/dev/zero of=test bs=1M count=1що ясніше.
123


1
Або використовуйте / dev / urandom замість / dev / zero, якщо потрібно випадкові дані.
користувач253751

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

dd один як терабайт
123

1
Визначте "великий файл" :-) Але я відредагував з інших зразків всі штати 10г ...
Ламберт

усікання Неможливо виконати "усікати". Немає такого файлу чи каталогу Truncate, здається, не лише Linux.
schily

truncateіснує на Solaris 11.2+
Lambert

11

Найшвидший спосіб створити великий файл у системі Linux fallocate:

sudo fallocate -l 2G bigfile

fallocateманіпулює файловою системою і насправді не записує в сектори даних за замовчуванням, і як таке надзвичайно швидко. Мінус у тому, що його потрібно запускати як root.

Запускаючи його послідовно в циклі, ви можете заповнити найбільші файлові системи за лічені секунди.

З man fallocate

fallocate використовується для маніпулювання виділеним дисковим простором для файлу, або для його розміщення, або для попереднього розміщення.
Для файлових систем, які підтримують виклик фаллокативної системи, попереднє розміщення здійснюється швидко, виділяючи блоки та позначаючи їх як неініціалізовані, не вимагаючи IO для блоків даних. Це набагато швидше, ніж створити файл, заповнивши його нулями.
Підтримується для 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.
Chaminda Bandara

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 за стільки ж часу.
тердон

Я здогадуюсь, що з підходом «кішки» в тому, що він росте експоненціально. Після запуску другої ітерації 'newfile' вже має 1 рядок, а файл - 2, а коли це зроблено, 'newfile' тепер 3 рядки, а 'файл' - 5. Далі, 'newfile' буде 8 та ' файл 'буде 13. Далі (21, 34) тощо
PypeBros

зворотний бік: під час створення файлу це може зайняти більше місця на диску (> = 1,5 * бажаний_розмір), ніж розмір цільового файлу.
PypeBros

btw. Якщо у вас є 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, але, в основному, ви не можете зв'язати файл безпосередньо в себе.


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