如何在 Linux 系统通过命令行生成随机文件

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

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

  • 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)

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

/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都支持的指令。

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

这里的思路就是找一个参照文件(比如说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行,效率会下降地比较厉害

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

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

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

胡恒威的专栏

1 篇文章1 人订阅

我来说两句

2 条评论
登录 后参与评论

相关文章

来自专栏快乐八哥

制作滑动条菜单,如何延时处理滑动效果,避免动画卡顿

    前几日在利用JQuery做菜单滑动标记这个效果的时候,最后发现滑动条在我用鼠标快速滑动的时候,会出现滑动条延迟滑动,并且有卡顿的现象,相当影响体验感受。...

742
来自专栏青玉伏案

iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)

今天博客中,我们就来实现一下一些常用资讯类App中常用的分类选择的控件的封装。本篇博客中没有使用到什么新的技术点,如果非得说用到了什么新的技术点的话,那么勉强的...

2135
来自专栏州的先生

在Selenium中进行网页元素定位的诸种方法

1133
来自专栏阮一峰的网络日志

JavaScript Source Map 详解

上周,jQuery 1.9发布。 ? 这是2.0版之前的最后一个新版本,有很多新功能,其中一个就是支持Source Map。 访问 http://ajax.go...

3215
来自专栏生信宝典

Bookdown文档生成教程

bookdown是一款及其方便的编写技术文档或教材的工具,语法简洁,数据处理灵活。支持Rmarkdown或普通markdown通过pandoc软件转换为HTML...

2395
来自专栏软件开发

前端MVC Vue2学习总结(一)——MVC与vue2概要、模板、数据绑定与综合示例

 一、前端MVC概要 1.1、库与框架的区别 ? 框架是一个软件的半成品,在全局范围内给了大的约束。库是工具,在单点上给我们提供功能。框架是依赖库的。Vue是框...

36710
来自专栏Felix的技术分享

使用TraceView工具定位耗时操作

1284
来自专栏xingoo, 一个梦想做发明家的程序员

《vi和vim》 学习手记(2)

:set wm=10 设置与右边界的距离。右边界为10个字符。 o 移到一行的开头 s 移到一行的结尾 w 移到下一个单词的 b 退后一个单词 S 更改一行文本...

1768
来自专栏cnblogs

bootstrap源码分析之tab(选项卡)

实现tab选项卡的应用,此插件相对比较简单 源码文件: tab.js 实现原理 1、单击一个元素时,首先将原来高亮的元素取消 2、然后给被单击元素进行高亮 3...

1748
来自专栏十月梦想

Vue动画封装的两种方式

    js方式我们需要引入之前的velocity.js,所需属性放入tempalate中,在模板的插槽中定义动画三个状态!

742

扫码关注云+社区