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.
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.
Ç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
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
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
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.
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
İ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)
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.
Etiketlerdeki diğer soruları oku command-line