Linux'ta 1GB'lık rasgele bir dosyayı nasıl oluşturabilirim?


88

Bash kabuğunu kullanıyorum ve komutun dışına openssl rand -base64 1000komut ddgibi komutu vermek istiyorum dd if={output of openssl} of="sample.txt bs=1G count=1. Değişkenleri kullanabileceğimi düşünüyorum ancak bunun en iyi nasıl yapıldığından emin değilim. Dosyayı oluşturmamın nedeni, rastgele metin içeren 1GB'lık bir dosya istiyorum.

Yanıtlar:


130

if=gerekli değildir, ddbunun yerine bir şeyleri boruya alabilirsiniz :

something... | dd of=sample.txt bs=1G count=1

Burada yararlı olmaz çünkü openssl randzaten bayt sayısını belirtmek gerekiyor. Yani aslında ihtiyacınız yok dd- bu işe yarar:

openssl rand -out sample.txt -base64 $(( 2**30 * 3/4 ))

1 gigabayt genellikle 2 30 bayttır ( bunun yerine 10**910 9 bayt için kullanabilirsiniz ). * 3/4Parçası haline Base64 yükü hesapları kodlanmış çıkış 1 GB.

Alternatif olarak, kullanabilirsiniz /dev/urandom, ancak OpenSSL’den biraz daha yavaş olacaktır:

dd if=/dev/urandom of=sample.txt bs=1G count=1

Şahsen ben kullanırım bs=64M count=16ya da benzer:

dd if=/dev/urandom of=sample.txt bs=64M count=16

2
Superuser.com/questions/467697/… adresinde büyük dosyaları sıkıştırmayla ilgili bir soru yayınladım ve kullanmanın /dev/urandomgerçek bir metin dosyası değil, ikili bir dosya oluşturduğu bildirildi.
FıstıkMonkey

2
@PeanutsMonkey: Sağ; gibi bir şeye ihtiyacın var dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt.
Scott

3
@PeanutsMonkey: tek bir "gerçek dünya senaryo" bazı senaryolar, metnin gigabayt başkalarına ilgili olabilir, var - JPEG gigabayt veya derlenmiş yazılımın gigabayt ile ... metnin bir sürü istiyorsanız, indirmek Vikipedi dökümü için örnek.
yerçekimi,

2
@PeanutsMonkey: dd750.000.000 bayt okur /dev/urandomve bunları içine aktarır uuencode. uuencodeGirişini bir temel64 kodlaması biçiminde kodlar (diğer programlarla mutlaka tutarlı değildir). Başka bir deyişle, bu ikili veriyi metne dönüştürür. 750M kullandım çünkü grawity'nin base64 kodlamasının% 33 veri genişlettiğine dair ifadesine güvenmiştim, bu nedenle metin dosyanızda istediğiniz kadar ikili veri istemeniz gerekiyor.
Scott

3
Unutmayın ki kesilmiş bir dosyadd: warning: partial read (33554431 bytes); suggest iflag=fullblock oluşturacaksa , bayrak ekleyin , sonra çalışır. iflag=fullblock
rogerdpack

25

1GB.bin rasgele içerik dosyası oluşturun:

dd if = / dev / urandom = 1GB.bin bs = 64M sayısı = 16 iflag = fullblock


3
Benim iflag=fullblockiçin gerekli olan diğer cevaplarla karşılaştırmalı olarak ilave edildi.
dojuba

2

EXACTLY 1GB istiyorsanız, aşağıdakileri kullanabilirsiniz:

openssl rand -out $ test dosyası -base64 792917038; kesmek -s-1 $ test dosyası

Openssl komutu bir dosyayı tam olarak 1 baytı çok büyük yapar. Truncate komutu bu baytı keser.


Bu ekstra bayt muhtemelen nedeniyle -base64. Çıkarılması, doğru boyutta bir dosyaya neden olur.
Daniel,

-1

Bu betiği dene.

#!/bin/bash
openssl rand -base64 1000 | dd of=sample.txt bs=1G count=1

Bu komut dosyası, kullanımı sakıncası olmadığı sürece çalışabilir /dev/random.

#!/bin/bash
dd if=/dev/random of="sample.txt bs=1G count=1"

8
Bunu /dev/randomyapmak için çok iyi bir neden olmadığı sürece bunun israfını tavsiye etmem . /dev/urandomçok daha ucuz.
Ansgar Wiechers

1
Ayrıca, $var=(command)bu bağlamda geçerli bir sözdizimi değil.
Grawity

@grawity - Geçerli olmadığını söylediğinde, ne demek istiyorsun?
FıstıkMonkey

Tam olarak demek istediğim - bu yanlış.
yerçekimi

3
@grawity, @PeanutsMonkey: Bir yazım hatası yaptı; demek istedi random=$(openssl rand -base64 1000). Bununla birlikte bash, bir değişkene gigabayt uzunluğunda bir değer atamanıza izin verip vermeyeceğinizi sorgularım . Ve siz söyleseniz bile random=$(openssl rand -base64 1000), sonraki if=$randomanlam ifade etmiyor.
Scott
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.