版权声明:本文由胡恒威原创文章,转载请注明出处:
文章原文连接:https://www.qcloud.com/community/article/86html
来源:腾云阁 https://www.qcloud.com/communitylinux
是否会有这样的场景:在有须要测试数据的时候,你不知如何生成一些已包含测试数据的文件;或者你是临时须要一个小的程序,可让你生成不一样大小的文件(好比大于1Mb少于100Mb),不须要从网络上去搜寻查找如何生成,这里有一些简单的方法帮你偷懒。ruby
Solaris、Mac OS X等Unix系统中mkfile指令,能够产生指定大小的文件,而Linux上则没有
例子:mkfile -n 160g test1
网络
Linux能够用dd指令,/dev/zero是一个特别的文件描述符能够经过它返回null值
例子:dd if=/dev/zero of=test.file count=1024 bs=1024
产生count * bs字节的文件,1M
此方法生成随机文件的好处在于效率高(产生1G文件大概1s),建立的文件大小精确到字节
坏处也有
使用null字符来填充文件内容,文件统计时没有行(wc -l test.file
为0)app
将/dev/zero
改成/dev/urandom
,/dev/urandom
是linux下的随机数生成器dom
关于/dev/urandom
跟/dev/random
二者的区别就不在此详细讨论,大概就是,前者是不受系统interrupts
的限制,即便没有足够的interrupt它也能经过随机数生成器产生足够的输出值;然后者若是用在dd
上,它不能被ctrl+c
或者kill -9
中断,若是ds的值较大时,产生的随机值不足而长期占用CPU。虽说/dev/random
产生的随机数会更随机些,但与dd混用仍是建议用/dev/urandom
效率更高。测试
缺点跟/dev/zero
比固然是效率会更低些了,生成个100Mb的文件须要10秒左右,并且文件并无可读的内容,通常的状况基本上是知足了。spa
漏了说句,dd
是linux与unix都支持的指令。操作系统
这里的思路就是找一个参照文件(好比说2行),将文件从新定向到新的文件,再mv覆盖保存,外加一个for循环。(n为循环次数,产生的文件行为2^(n+1))
unix
例子:假设先创建一个file.txt文件,里面含有Hello 和 World两行
for i in {1..n}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done
因为是阶乘,n=20左右已是200W行,效率会降低地比较厉害
这种状况下系统的指令应该是不能知足了,或者能够经过操做系统的指令写一大串脚本也能够达到,但不建议这么作,由于可读性和维护性考虑,你应该要引入Ruby或者Python类的脚本语言帮忙了
但仍是要借助些系统的东西来帮忙
思路:/usr/share/dict/words
里面有记录一些单词,一共235886行,每行一个单词
能够从里面挑选一些做为文件的内容
加循环达到咱们想要的随机文件要求
举例:ruby -e 'a=STDIN.readlines;X.times do; b=[];Y.times do; b<<a[rand(a.size)].chomp end; puts b.join(" ")' < /usr/share/dict/words > file.txt
X为随机文件须要的行数,Y为从words中读取的单词,虽然说组合成一句的命令,仍是能够读懂的;从标准输入中重复读取Y个单词,写入到b列表中,而后再经过join空格链接内容写入到标准输出文件file.txt中
这样基本不多会有重复的行了,并且生成的效率与其余方法对比仍是能够的,10秒生成100Mb文件。欢迎你们讨论。
mkfile的Apple官方文档:
https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/mkfile.8.html
dd的wiki:
http://en.wikipedia.org/wiki/Dd_(Unix)