如何在 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 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cloudskyme

设计模式(5)-己所不欲,施之于人(代理模式)

什么是代理?在我们的日常生活中的例子非常多。 比如上网有的时候使用代理服务器,通过代理上网,这就是代理的一个非常常见的例子。 从这里边可以看到3个对象:真实网路...

3434
来自专栏农夫安全

XSS姿势——文件上传XSS

一个文件上传点是执行XSS应用程序的绝佳机会。很多网站都有用户权限上传个人资料图片的上传点,你有很多机会找到相关漏洞。如果碰巧是一个self XSS,你可以看看...

3232
来自专栏Java技术分享

redis集群原理

 redis是单线程,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了。

3839
来自专栏linux驱动个人学习

Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程--Linux进程的管理与调度(二十八)

每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择...

1582
来自专栏嵌入式程序猿

快来趴一趴JTAG那些事(下)

你以为你不知道,其实它一直就在你身边,JTAG是嵌入式开发中在熟悉不过的一个名词了,但是你真的很了解他吗,来一块趴一趴JTAG的那些事,今天来学习JTAG指令 ...

3548
来自专栏贾老师の博客

【笔记】高性能服务器设计

1304
来自专栏DeveWork

Gravatar开发者手册

Gravatar上所有URL都是基于电子邮箱地址的哈希值。图像和个人档都是通过电子邮件的哈希值访问获取的,这是系统识别用户身份的主要方式。为确保哈希值的一致性和...

3105
来自专栏Java技术分享

redis集群原理

redis是单线程,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了。       官方的一个简单测试:     测试完成了50个并发执行1...

2529
来自专栏北京马哥教育

用Linux命令行生成随机密码的十种方法

Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它。例如,你可以通过数十种方法来生成随机密码。本文将介绍生成随机密码的十种方法。 ...

3336
来自专栏人工智能

分布式TensorFlow入坑指南:从实例到代码带你玩转多机器深度学习

通过多 GPU 并行的方式可以有很好的加速效果,然而一台机器上所支持的 GPU 是有限的,因此本文介绍了分布式 TensorFlow。分布式 TensorFlo...

2567

扫码关注云+社区

领取腾讯云代金券