如何在Linux中创建一个1GB的随机文件?


88

我正在使用bash shell,并希望将命令外的内容openssl rand -base64 1000传递给命令,dd例如dd if={output of openssl} of="sample.txt bs=1G count=1。我认为我可以使用变量,但是我不确定如何做到最好。我要创建文件的原因是因为我想要一个1GB的随机文本文件。

Answers:


130

if=不是必需的,您可以通过管道将一些内容导入其中dd

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

这在这里没有用,因为openssl rand无论如何都需要指定字节数。因此,您实际上不需要dd可以工作:

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

1 GB通常是2 30字节(尽管您可以使用10**910 9字节来代替)。该* 3/4部分解决了Base64开销,使编码输出为1 GB。

或者,您可以使用/dev/urandom,但是它会比OpenSSL慢一点:

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

就个人而言,我会使用bs=64M count=16或类似的方法:

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

2
我在superuser.com/questions/467697/…上发布了有关压缩大文件的问题,并被告知使用会/dev/urandom生成二进制文件而不是真实文本文件。
PeanutsMonkey 2012年

2
@PeanutsMonkey:是的;您将需要类似的东西dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt
斯科特

3
@PeanutsMonkey:没有一个单独的“现实世界场景”,某些场景可能正在处理数千兆字节的文本,另一些场景则需要数千兆字节的JPEG或数千兆字节的编译软件……如果您需要大量文本,请下载Wikipedia转储以获取例。
grawity 2012年

2
@PeanutsMonkey:dd读取750,000,000 字节/dev/urandom并将其通过管道传输到uuencodeuuencode将其输入编码为base64编码的形式(不一定与其他程序一致)。换句话说,这会将二进制数据转换为文本。我之所以使用750M,是因为我信任grawity的声明,即base64编码会将数据扩展33%,因此您需要在文本文件中索取3/4的二进制数据。
Scott

3
注意,如果它说dd: warning: partial read (33554431 bytes); suggest iflag=fullblock它将创建一个被截断的文件,那么添加该iflag=fullblock标志,然后它就可以工作了。
rogerdpack

25

创建一个1GB.bin随机内容文件:

dd if = / dev / urandom of = 1GB.bin bs = 64M count = 16 iflag = fullblock


3
对我来说,iflag=fullblock与其他答案相比是必要的补充。
dojuba '18

2

如果您希望精确到1GB,则可以使用以下内容:

openssl rand -out $ testfile -base64 792917038; 截断-s-1 $ testfile

openssl命令使文件恰好1个字节太大。truncate命令修剪该字节。


多余的字节可能是因为-base64。删除它会导致文件大小正确。
丹尼尔

-1

试试这个脚本。

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

只要您不介意使用,此脚本就可以工作/dev/random

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

8
/dev/random除非有充分的理由,否则我不建议您浪费时间。/dev/urandom便宜得多。
Ansgar Wiechers,2012年

1
同样,$var=(command)在这种情况下不是有效的语法。
grawity 2012年

@grawity-当您说它无效时,您是什么意思?
PeanutsMonkey 2012年

我的意思就是-这是不正确的。
grawity 2012年

3
@ grawity,@ PeanutsMonkey:他打错了字;他的意思是random=$(openssl rand -base64 1000)。尽管我会质疑是否bash允许您将一个千兆字节的值分配给变量。即使您说了random=$(openssl rand -base64 1000),后续if=$random也没有道理。
斯科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.