Bir dizi kelimeyi sonsuz olarak tekrar eden bir dosya nasıl oluşturulur?

19

Bir dizi kelimeyi sonsuz olarak tekrarlayan bir dosya nasıl oluşturulur? Boyutu 2-4GB gibi ayrıştırma amaçları için büyük bir dosya oluşturmak için ihtiyacım var. Şu anda, boyutu artırmak için satırları aynı dosyaya yapıştırarak el ile kopyayorum.

    
sordu Nisheet 27.09.2016 07:55

7 cevap

49

Çok sayıda satırı tekrarlamanın kolay bir yolu var:

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

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

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

yes we have no bananas | head -c 10000 > out.txt
    
verilen cevap hobbs 27.09.2016 09:53
10

Metni tekrarla sonsuz olarak öneremiyorum, ancak python'la tekrar tekrar ~ 2GB'lık bir metin yapabilirsiniz.

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

Bu "merhaba dünya" 10 kez basar ve yeni bir çizgi yapar ve 20.000.000 kez tekrar eder, sonucu bigfile dosyasına yazar. Tüm karakterleriniz ASCII ise, o zaman her biri bir bayttır, bu yüzden ne yazmak istediğinize bağlı olarak uygun bir şekilde hesaplayın ...

İşlemciniz sahip olabilir. 10.000.000'den fazla hat yapmayı denediğimde RAM'in tükendi ...

Yine de bir tost kullanıyorum

    
verilen cevap Zanna 27.09.2016 08:21
9

Perl,% x operatörüne sahip:

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

Yani, basit bir çözüm olarak, hattı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
    
verilen cevap terdon 27.09.2016 12:42
7
  • Bir dosyada tekrarlanacak sözcük kümesini ör. % Co_de%. Bayt cinsinden source.txt boyutunu alın. için:

     stat -c '%s' source.txt
    
  • Hedef dosyanın boyutuna karar verin örn. source.txt , 2 GB veya 4 GB veya her neyse. Boyutu byte cinsinden.

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

  • bash işlemini bölüm sonuç zamanlarını tekrarlamak için for yapısını kullanın. Bu, tekrarlama ile alabileceğiniz hedef dosya boyutunun yaklaşık en yakını olacaktır. İşlemin çıkışı cat source.txt olarak kaydedilir.

Örneğin, destination.txt 'sinin 30 bayt olduğunu ve 2 GB'lık bir dosya oluşturmak istediğimizi varsayalım:

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

Burada, başlatma zamanında üst sınırı source.txt olarak ayarlıyorum; sonucu alabilir ve buraya da yerleştirebilirsiniz.

Operasyon biraz zaman alacaktı; ((16777216/30)) daha büyük, daha az zaman gerekli olacaktır.

    
verilen cevap heemayl 27.09.2016 08:25
6

Ayrıca while -loop kullanabilirsiniz.

Örnek: % Co_de% içeriği (Bu, kaynağınız):

foo
bar
foobar

foo.txt boş (Bu, hedef dosyanızdır). Artık bar.txt içeriğini birkaç kez foo.txt 'ye yazmak için aşağıdaki döngüyü kullanabilirsiniz:

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

Açıklama:

  • bar.txt , bayt cinsinden stat --format "%s" bar.txt boyutunu gösterir.
  • bar.txt hedef boyutu (bu durumda 150 bayta) ulaşılana kadar aşağıdaki eylemler tekrarlanacaktır.
  • while [ $(stat --format "%s" bar.txt) -lt 150 ] , cat foo.txt >> bar.txt içeriğini foo.txt öğesine ekler
verilen cevap Wayne_Yux 27.09.2016 09:52
4

İlk ateş komutu:

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

, bizim durumumuzda 2048 * 10 = 20Kb boyutunda bs * rasgele bayt sayımı yolu üzerinde bir dosya oluşturacaktır. bu gereksinime göre değiştirilebilir.

cat - > file.txt

Bu komutlar STDIN'i bir dosyaya yönlendirir, böylece iki satır girmeniz ve sonra Ctrl + D tuşlarına basmanız gerekecektir. Sonra aşağıdaki komutu çalıştırmanız gerekecek:

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

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

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

Başlamanıza yardımcı olacak bazı numaralar:

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)
    
verilen cevap Avani badheka 27.09.2016 08:22
4

FIFO'lar muhtemelen sizin aradığınız şeydir. Programınızı belirli bir dosya ile çağırmak yerine, bir kabuk komutunun sonucunu süreç altyazısıyla bağlayabilirsiniz. ve program çıktılarını bir düz metin dosyası olarak görecek. Buradaki avantaj, artık disk alanınız tarafından sınırlandırılmamasıdır, bu nedenle programınızın tüm dosyayı önce arabelleğe alması gerekmediği ve satır satırını ayrıştıramayacağı sürece, aksi halde imkansız olabilecek dosyalara ulaşabilirsiniz. Ö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, bir HDD alanı ve herhangi bir RAM değerinden hiçbir ücret ödemeden 95 gigabaytlık bir dosya (wc'ye göre) verir, sadece okunmadan önce komutun ne getireceğini arabellemek için yeterlidir. Bu, "sonsuza kadar" kadar yakın olacak.

    
verilen cevap Santo Guevarra 28.09.2016 19:35

Etiketlerdeki diğer soruları oku