Sonsuz bir dizi kelimeyi tekrar eden terminalden bir dosya nasıl oluşturulur?


19

Sonsuz bir dizi kelimeyi tekrar eden terminalden bir dosya nasıl oluşturulur? Boyutu 2-4GB gibi amaçlar için büyük bir dosya oluşturmak gerekir. Şu anda el ile satırları aynı dosyaya yapıştırarak boyutunu artırmak için kopyalıyorum.


1
Özel unix dosyalarıyla çalışan bir cevap görmek istiyorum, bu yüzden aslında bu alanı işgal etmeyecekti. Mümkün mü?
Délisson Junio

1
Gerçekten sonsuz bir şey mkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; donemi demek istiyorsun ?
Boldewyn

Yanıtlar:


50

Bir satırı birçok kez tekrarlamanın kolay bir yolu vardır:

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

"muzumuz yok" diyen 10.000 satır içeren out.txt ile sonuçlanır.


Çıkışı kesin bayt sayısıyla sınırlamak için, yerine head's' -cseçeneğini kullanın -n. Örneğin, bu tam olarak 10 kB metin üretir:

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

2
OP satırlarla değil baytlarla uğraşmak istiyor.
heemayl

4
Bayt cinsinden bir sınır belirtmek için 10k satır head -c 10000yerine 10 kB kullanın head -n 10000.
Bayt Komutanı

@ByteCommander evet, ancak bu, bir satırın ortasında çıktının kesilmesini engellemez. Boyutun kesin olması gerekmediğinden, doğru boyutu elde etmek ve yuvarlamak için satır sayısını anladım :)
ocaklar

1
Kabul ediyorum, ama bunun da bir sorun olup olmayacağından emin değilim. OP hangi yöntemi istediğini belirtmedi, ancak cevabınız hala ikisini de içeriyor. Oh, ve bugün itibar puanını ikiye katladığınız için tebrikler :)
Byte Commander

@ByteCommander evet, adil.
hobbs

10

Sonsuz yinelenen metin tavsiye edemez , ancak böyle bir python ile ~ 2GB tekrarlanan metin dosyası yapabilirsiniz ...

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

Bu, "merhaba dünya" yı 10 kez yazdıracak ve yeni bir satır oluşturacak ve 20.000.000 kez tekrarlayarak sonucu dosyaya yazacaktır bigfile. Tüm karakterleriniz ASCII ise, her biri bir bayttır, bu yüzden yazmak istediğiniz şeye bağlı olarak uygun şekilde hesaplayın ...

İşlemcinizin sahibi olabilir. 10.000.000 satırdan fazlasını yapmaya çalışırsam RAM'im tükenir ...

Yine de ekmek kızartma makinesi kullanıyorum


OP satırlarla değil baytlarla uğraşmak istiyor.
heemayl

@heemayl elbette cevabınız daha iyi, ama (belirsiz) istenen bayt almak için kaç satır kullanılacağını nasıl açıklayacağımı açıkladım, bu yüzden cevabımın tamamen işe yaramaz olduğunu düşünmüyorum
Zanna

4
@heemayl OP'nin bayt istediğinden emin olmanızı sağlayan şey nedir? Soru aslında OP'nin büyük bir dosya istediğini belirtiyor. Belirli boyut çok belirsiz (2-4GB), bu yüzden akılda belirli bir bayt sınırı olduğundan şüpheliyim.
terdon

1
@ heemayl evet, ama bu çok, çok belirsiz. Anladığım kadarıyla, OP sadece büyük bir dosya istiyor ve tam bir boyutu umursamıyor. Aksi takdirde, bu kadar geniş bir boyut aralığı yerine bir boyut verirdiler.
terdon

1
@cat ikr! <3python <3
Zanna

9

Perl şık xoperatöre sahiptir:

$ perl -e 'print "foo\n" x 5'
foo
foo
foo
foo
foo

Yani, basit bir çözüm olarak, satırınızı birkaç milyon kez yazabilirsiniz. Örneğin, bu komut bir 3G dosyası oluşturdu:

perl -e 'print "This is my line\n" x 200000000' > file

Tam bir boyut belirtmeniz gerekiyorsa (bu durumda 2 GiB), şunları yapabilirsiniz:

perl -e 'use bytes; while(length($str)<2<<20){ $str.="This is my line\n"} print "$str\n"' > file

Sabırlıysanız, Perl 6'nın çok, çok, çok, çok daha yavaş olması dışında serin Perl 6 operatörlerini kullanabilirsiniz: D
cat

@ kedi gerçekten mi? Hiç 6 dokunmadım, ama sadece perly iyilik artı OO ekstralar olacağını varsaymıştı. Neden daha yavaş olduğuna dair bir fikrin var mı?
terdon

1
Yorumum çoğunlukla geveze, ama buldum Perl 6 canonically çok daha yavaş (ı testi vermedi) Perl 5'ten olan Python 3 ile karşılaştırıldığında, oldukça yavaş olduğunu, bu yılın başında. Çalışmalar henüz performansa değil özelliklere ve doğruluk üzerine odaklanmıştır, ancak 2015 için bir hedef olarak listelenmiştir. Ayrıca, Perl 6 benim için yeterince hızlı mı? .
kedi

(Öte yandan, özellik listesi en az söylemek etkileyici .)
kedi

7
  • Tekrarlanacak sözcük kümesini bir dosyaya koyun, ör source.txt. Boyutunu source.txtbayt cinsinden alın, örneğin:

     stat -c '%s' source.txt
    
  • Hedef dosyanın boyutuna karar verin, örneğin destination.txt2 GB veya 4 GB veya başka bir şey. Boyutu bayt cinsinden dönüştürün.

  • Hedef dosya boyutunu kaynak dosya boyutuna bölün. bashkayan nokta aritmetiği yapamaz, ancak bu durumda gerekli değildir.

  • Bölme sonuç zamanlarını forbir cat source.txtişlemi tekrarlamak için bir yapı kullanın . Bu, tekrarlamayla alabileceğiniz hedef dosya boyutuna en yakın yaklaşık olacaktır. İşlemin çıktısı kaydedilir destination.txt.

Örneğin, source.txt30 bayt olduğunu varsayarsak ve 2 GB'lık bir dosya oluşturmak istiyoruz:

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

Burada ((16777216/30))başlatma sırasında üst sınırı ayarlıyorum ; sonucu alıp buraya da koyabilirsiniz.

Operasyon biraz zaman alacaktı; ne kadar büyük olursa source.txt, o kadar az zaman gerekecektir.


1
destination.txtDöngünün her yinelemesi için bu bir kez açılıp kapanmıyor mu?
Monica'yı eski durumuna getir - Sep--

@ hexafraction Duh, düzeltildi.
heemayl

6

Bir while-loop da kullanabilirsiniz .

Örnek: İçeriği foo.txt(Bu sizin kaynağınızdır):

foo
bar
foobar

bar.txtboş (Bu sizin hedef dosyanızdır). Artık foo.txtbirden çok kez içerik yazmak için aşağıdaki döngüyü kullanabilirsiniz bar.txt:

while [ $(stat --format "%s" bar.txt) -lt 150 ] 
do 
    cat foo.txt >> bar.txt
done

Açıklama:

  • stat --format "%s" bar.txtbar.txtbayt cinsinden boyutunu görüntüler .
  • while [ $(stat --format "%s" bar.txt) -lt 150 ] hedef büyüklüğe (bu durumda 150 bayt) ulaşılana kadar aşağıdaki işlemler tekrarlanır.
  • cat foo.txt >> bar.txtiçeriğini eklemek foo.txtiçinbar.txt

4

ilk ateş komutu:

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

Bizim durumumuzda 2048 * 10 = 20Kb boyutunda bs * sayımı yolunda bir dosya oluşturacaktır. bu şartının olarak değiştirilebilir.

cat - > file.txt

Bu komutlar STDIN dosyasını bir dosyaya yönlendirir, bu nedenle iki satır girmeniz ve sonra Ctrl + D tuşlarına basmanız gerekir. Ardından aşağıdaki komutu çalıştırmanız gerekir:

for i in {1..n}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done

Burada n bir tamsayıdır. Bu, orijinal iki satırınızı çoğaltarak içinde 2 ^ (n + 1) satır içeren bir dosya oluşturur. 16 satırlı bir dosya oluşturmak için:

for i in {1..3}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done

İşte başlamanız için birkaç sayı daha:

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
OP satırlarla değil baytlarla uğraşmak istiyor.
heemayl

OP ayrıca dosyayı doldurmak için başa çıkma hattı tutmaktır. ve ilk komutum gerekli bellek baytlarına göre zaten dosya oluşturdu.
Avani badheka

@heemayl yeni satır karakteri hala önceki yorumumla aynı şekilde bir bayt kaplıyor. Bu meşru bir karakter. Ancak, OP Avani kelimeleri belirledi , bu yüzden / dev / urandom tekniğinizin sorularına cevap verdiğini sanmıyorum.
Mike S

Bazı rastgele baytları denemek isteyip istemediğiniz / dev / urandom'a bağlıdır. Hatta bu kadar bayt veri içeren bazı dosyalarınızı seçebilirsiniz.
Avani badheka

4

FIFO'lar muhtemelen aradığınız şeydir. Programınızı belirli bir dosyayla çağırmak yerine, kabuk alt komutunun sonucunu süreç altyazısı ile bağlayabilirsiniz ve program çıktısını düz metin dosyası olarak görür. Buradaki avantaj, disk alanınızla sınırlı kalmamanızdır, böylece programınızın önce tüm dosyayı arabelleğe alması gerekmediği ve satır satır ayrıştırabildiği sürece, aksi takdirde imkansız olan dosya boyutlarına erişebilirsiniz. Örneğin, içerik oluşturmak için @hobbs yanıtını kullanarak:

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

Bu bana sabit disk alanında ve neredeyse herhangi bir RAM'de hiçbir ücret ödemeden 95 gigabaytlık bir dosya (wc'ye göre) veriyor, sadece komut okunmadan önce ne döndürdüğünü arabelleğe alacak kadar. Bu yaklaşık "sonsuz" yakın almak gibi olacak.

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.