博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在Linux系统通过命令行生成随机文件
阅读量:4198 次
发布时间:2019-05-26

本文共 1797 字,大约阅读时间需要 5 分钟。

是否会有这样的场景:在有需要测试数据的时候,你不知如何生成一些已包含测试数据的文件;或者你是临时需要一个小的程序,可以让你生成不同大小的文件(比如大于1Mb少于100Mb),不需要从网络上去搜寻查找如何生成,这里有一些简单的方法帮你偷懒。

 

A、当你不需要关心随机文件的内容,只需一个固定大小的文件

 

1、Solaris、Mac OS X等Unix系统中mkfile指令,可以产生指定大小的文件,而Linux上则没有

 

例子:

mkfile -n 160g test1

2、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)

 

B、当你不需要关心随机文件的内容,但期望测试文件能有统计的行

 

将/dev/zero改为/dev/urandom,/dev/urandom是linux下的随机数生成器

 

关于/dev/urandom跟/dev/random两者的区别就不在此详细讨论,大概就是,前者是不受系统interrupts的限制,即使没有足够的interrupt它也能通过随机数生成器产生足够的输出值;而后者如果用在dd上,它不能被ctrl+c或者kill -9中断,如果ds的值较大时,产生的随机值不足而长期占用CPU。虽然说/dev/random产生的随机数会更随机些,但与dd混用还是建议用/dev/urandom效率更高。

 

缺点跟/dev/zero比当然是效率会更低些了,生成个100Mb的文件需要10秒左右,而且文件并没有可读的内容,一般的情况基本上是满足了。

 

漏了说句,dd是linux与unix都支持的指令。

 

C、当你关心文件的随机内容行数,而不关心内容是否有所重复

 

这里的思路就是找一个参照文件(比如说2行),将文件重新定向到新的文件,再mv覆盖保存,外加一个for循环。(n为循环次数,产生的文件行为2^(n+1))

 

例子:假设先建立一个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行,效率会下降地比较厉害

 

D、当你关心随机文件的内容,而不想出现重复内容行情况

 

这种情况下系统的指令应该是不能满足了,或者可以通过操作系统的指令写一大串脚本也可以达到,但不建议这么做,因为可读性和维护性考虑,你应该要引入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文件。欢迎大家讨论。

 

 

参考:

 

1、mkfile的Apple官方文档

 

https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/mkfile.8.html

 

2、dd的wiki

 

http://en.wikipedia.org/wiki/Dd_(Unix)

 

转载地址:http://yquli.baihongyu.com/

你可能感兴趣的文章
【IOS游戏开发】之IPA破解原理
查看>>
【一天一道LeetCode】#45. Jump Game II
查看>>
【一天一道LeetCode】#46. Permutations
查看>>
【一天一道LeetCode】#47. Permutations II
查看>>
【一天一道LeetCode】#48. Rotate Image
查看>>
【一天一道LeetCode】#56. Merge Intervals
查看>>
【一天一道LeetCode】#57. Insert Interval
查看>>
【一天一道LeetCode】#58. Length of Last Word
查看>>
【一天一道LeetCode】#59. Spiral Matrix II
查看>>
【一天一道LeetCode】#30. Substring with Concatenation of All Words
查看>>
【一天一道LeetCode】#60. Permutation Sequence.
查看>>
【一天一道LeetCode】#62. Unique Paths
查看>>
【一天一道LeetCode】#61. Rotate List
查看>>
【一天一道LeetCode】#63. Unique Paths II
查看>>
【一天一道LeetCode】#36. Valid Sudoku
查看>>
【一天一道LeetCode】#75. Sort Colors
查看>>
【一天一道LeetCode】#76. Minimum Window Substring
查看>>
【计算机网络 第五版】阅读笔记之一:概述
查看>>
【计算机网络 第五版】阅读笔记之二:物理层
查看>>
【计算机网络 第五版】阅读笔记之三:数据链路层
查看>>