UNIX'te büyük bir dosya nasıl oluşturulur?


17

Windows'ta böyle bir şey yapmanın bir yolunu buldum

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'te bir dosyayı kopyalamanın, ekleme ve ardından işlemi tekrarlamanın bir yolu var mı? Gibi bir şey for .. cat file1.txt > file1.txt?


Neden dosyayı kopyalamak yerine sadece eklemek yerine eklemelisiniz?
123

@ 123 append iyidir, ama döngü nasıl yapılır?
Thomas Lee

4
for i in {1..1000000};do echo "string" >> file;donebash.
123

9
Bir metin dosyası olmalı mı? / Dev / zero veya / dev / urandom'dan istediğiniz boyutta dosya oluşturabilirsiniz.
RealSkeptic

2
type file >> fileSonsuz bir döngüde çalışmayı beklerdim (en azından bir tamponun içine sığmayacak kadar büyük olur).
Stéphane Chazelas

Yanıtlar:


29
yes "Some text" | head -n 100000 > large-file

csh/ İle tcsh:

repeat 10000 echo some test > large-file

İle zsh:

{repeat 10000 echo some test} > large-file

GNU sistemlerinde ayrıca bkz:

seq 100000 > large-file

Veya:

truncate -s 10T large-file

(10 TB'lık seyrek bir dosya oluşturur (çok büyük ancak diskte yer kaplamaz)) ve "Çok sayıda sıfır baytlı bir test dosyası oluşturma" bölümünde tartışılan diğer alternatifler .


Yapmak cat file >> filekötü bir fikir olurdu.

İlk catolarak, çıktı dosyalarıyla aynı olan dosyaları okumayı reddeden bazı uygulamalarla çalışmaz . Ancak cat file | cat >> file, iç arabellekten filedaha büyükse , etrafında çalışsanız bile , daha önce yazdığı verileri okuyacağı için sonsuz bir döngüde çalışmasına catneden olur cat.

Dönen bir sabit sürücü tarafından desteklenen dosya sistemlerinde, sürücünün verileri okuyacağı konum arasında ileri geri gitmesi gerekeceğinden (bellekte önbelleğe alınacakdan daha büyük bir boyuta ulaştıktan sonra) oldukça verimsiz olurdu, ve nereye yazacağım.


19
Veya dd if=/dev/zero of=large-file bs=1024 count=10241 MB'lık bir dosya için
doneal24 11:16

7
@ DougO'Neal Daha dd if=/dev/zero of=test bs=1M count=1net buluyorum .
123


1
Veya rasgele veri istiyorsanız / dev / zero yerine / dev / urandom kullanın.
user253751

3
@ robertotomás evet, herkes kullanıyor dd, ama nedenini hiç anlamadım. Aslında, sadece bir MBR veya benzer saçak görevleri okumak için kullandığımı düşünüyorum. Deneyimlerime göre, diğer araçlar insanların kullandığı vakaların büyük çoğunluğu için daha hızlı, daha basit ve daha güvenlidir dd. Bence bu yaygın olan durumlardan biri! = Optimal, like sudo suveya cat file | grep foo.
terdon

22

Solaris'de aşağıdakileri kullanarak büyük bir dosya oluşturabilirsiniz:

mkfile 10g /path/to/file

Solaris (ve Linux) üzerinde çalışan başka bir yol:

truncate -s 10g /path/to file

Kullanmak da mümkündür:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240

gg bir terabayt gibidir
123

1
"Büyük bir dosya" tanımlayın :-) Ama diğer örnekleri beri tüm devlet 10g düzenledi ...
Lambert

truncate 'truncate' çalıştırılamıyor. Böyle bir dosya veya dizin Truncate sadece Linux gibi görünmüyor.
schily

truncateSolaris 11.2+ üzerinde mevcut
Lambert

11

Bir Linux sisteminde büyük bir dosya oluşturmanın en hızlı yolu fallocate:

sudo fallocate -l 2G bigfile

fallocatedosya sistemini yönetir ve varsayılan olarak veri sektörlerine yazmaz ve bu nedenle son derece hızlıdır. Dezavantajı, kök olarak çalıştırılması gerektiğidir.

Bir döngüde art arda çalıştırarak, en büyük dosya sistemlerini saniyeler içinde doldurabilirsiniz.

itibaren man fallocate

fallocate bir dosya için ayrılan disk alanını değiştirmek veya yeniden konumlandırmak için kullanılır.
Fallocate sistem çağrısını destekleyen dosya sistemleri için, önceden tahsis blokları tahsis ederek ve bunları başlatılmamış olarak işaretleyerek veri bloklarına GÇ gerektirmez. Bu, sıfırlarla doldurarak bir dosya oluşturmaktan çok daha hızlıdır.
XFS (Linux 2.6.38'den beri), ext4 (Linux 3.0'dan beri), Btrfs (Linux 3.7'den beri) ve tmpfs (Linux 3.5'ten beri) için desteklenir.


1
Bu kabul edilen cevap olmalı. Kolay ve hızlı.
ardochhigh

8

CTRL-C olana kadar bu devam eder:

yes This is stuff that I want to put into my file... >> dummy.txt

Yine de dikkatli olun, çünkü saniyede yüz binlerce satır alabilirsiniz ...

Gönderen man yes:

yes - output a string repeatedly until killed

Bu, Linux ortamında büyük bir dosya oluşturmak için çok kolay bir yöntemdir.
Chaminda Bandara

1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtkesin bir miktar elde etmenizi sağlar. (-n $ TARGET_NUMBER_OF_LINES). hedef sayıya ulaşıldığı için sona erdiğinde yes'kırık boru' headnedeniyle otomatik olarak ölür .
PypeBros

4

Seni doğru anlarsam, şöyle bir şey arıyorsun:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

Bu, 22 "test çizgisi" tekrarına sahip bir dosya oluşturur. Belirli bir dosya boyutu istiyorsanız, böyle bir şey kullanabilirsiniz (Linux'ta). 1024 bir kilobayttır:

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

Şahsen, büyük bir dosya oluşturmak istediğimde, iki dosya kullanıyorum ve birini diğerine katıyorum. İstediğiniz boyuta (1MB burada) ulaşıncaya kadar işlemi tekrarlayabilirsiniz:

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

Bu çözüm genellikle istenen boyutu aşacaktır, çünkü dosya sınırın altındaysa, her şey tekrar içine girecektir.

Son olarak, istediğiniz tek şey istenen boyutta bir dosyaysa ve aslında bir şey içermesine gerek yoksa, şunları kullanabilirsiniz truncate:

truncate -s 1M file

1
Does catdosya aslında sadece olsa ekleme için herhangi bir avantajı var ing? Her döngüyü iki işlemden ayırmak ve tüm içeriği birden çok kez taşımak zorunda olduğu için daha uzun sürecek gibi görünüyor.
123

1
@ 123 hız. catYaklaşım çok daha hızlı, fazla. Sadece büyük dosyalar oluşturmak mantıklı ama makinemde 10 saniyede 545M dosya oluşturdu. Aynı whiledöngü echo "test line" >> file, aynı sürede 96K dosya oluşturdu.
terdon

"Kedi" yaklaşımı ile sanırım katlanarak büyüyor. İkinci yinelemenin başlangıcında, 'newfile' zaten 1 satıra ve 'file' 2'ye sahiptir ve tamamlandığında, 'newfile' artık 3 satırdır ve 'file' 5'tir. Ardından, 'newfile' 8 ve 'olacaktır. dosya
'13

olumsuz tarafı: dosyayı oluştururken hedef dosya boyutundan daha fazla disk alanı (> = 1.5 * istenilen_boyut) alabilir.
PypeBros

Btw. truncateEtrafınızda varsa truncate -s 1G, dosyayı ilk etapta oluşturabilirsiniz. unix.stackexchange.com/a/269184/85549 . head -c $DESIRED_SIZEMuhtemelen whiledöngü içinde bir ile değiştirebilirsiniz .
PypeBros

3

İçeriğini vermemizi /dev/urandomiçin headbunu bir dosyaya çıktı yönlendirebilirsiniz:

 cat /dev/urandom | head --bytes=100 >> foo.bar

100 bayt çöp içeren bir dosya verecektir.


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 komut dosyanızın aynı etkisini ancak bash'da bir dosyayı doğrudan kendinize birleştiremezsiniz.


.txtUzantıyı unutmanın yanı sıra , sonunda 2 büyük dosya bırakıyorsunuz.
ott--
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.