版权声明:本文由胡恒威原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/86

来源:腾云阁 https://www.qcloud.com/community

是否会有这样的场景:在有需要测试数据的时候,你不知如何生成一些已包含测试数据的文件;或者你是临时需要一个小的程序,可以让你生成不同大小的文件(比如大于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官方文档:
https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/mkfile.8.html
dd的wiki:
http://en.wikipedia.org/wiki/Dd_(Unix)

如何在Linux系统通过命令行生成随机文件的更多相关文章

  1. [转帖]如何在Linux上使用命令行查看硬件信息

    如何在Linux上使用命令行查看硬件信息 时间:2016-01-13   作者:admin 分类:新手入门 阅读:126次 http://embeddedlinux.org.cn/emb-linux/ ...

  2. 【转载】Linux系统下命令行连接蓝牙设备 查看查找 蓝牙

    Linux系统下命令行连接蓝牙设备 2018年11月26日 10:47:27 Zz笑对一切 阅读数:741   1.打开系统蓝牙 sudo service bluetooth start 1 进入bl ...

  3. 【转载】【Centos linux系统】命令行(静默)安装oracle 11gR2

    [原文]:http://blog.chinaunix.net/uid-23886490-id-3565998.html 一.安装前准备 1.内存及swap要求 至于swap如何添加,后文将提到 gre ...

  4. 【Centos linux系统】命令行(静默)安装oracle 11gR2

    一.安装前准备 1.内存及swap要求 至于swap如何添加,后文将提到 1 2 grep MemTotal /proc/meminfo grep SwapTotal /proc/meminfo 2. ...

  5. java程序高CPU,如何直接定位(linux系统下命令行操作)

    1.top命令找出 2.也可以使用 (1)ps -ef|grep java|grep -v grep (2)jps -l|grep  公司名 然后,记住PID是9529. 3.定位具体的线程或者代码: ...

  6. 如何在Linux中使用命令行卸载软件

    您可以使用“dpkg”命令来查看您的计算机,按“Ctrl + Alt + T”的所有已安装包的列表,打开一个终端窗口. 在提示符下键入以下命令,然后按Enter键.dpkg -- list 要卸载程序 ...

  7. Linux(CentOS 7)命令行模式安装VMware Tools 详解

    本篇文章主要介绍了如何在Linux(CentOS 7)命令行模式安装VMware Tools,具有一定的参考价值,感兴趣的小伙伴们可以参考一下. 本例中为在Linux(以CentOS 7为例)安装VM ...

  8. Mac OSX系统、Linux、Windows命令行教程

    目录 Mac OSX系统.Linux.Windows命令行教程 一.各系统终端的使用方法 二.各系统命令的功能 Mac OSX系统.Linux.Windows命令行教程 用你的终端做一些事情 (com ...

  9. Redis进阶实践之二如何在Linux系统上安装安装Redis(转载)(2)

    Redis进阶实践之二如何在Linux系统上安装安装Redis 一.引言 上一篇文章写了“如何安装VMware Pro虚拟机”和在虚拟机上安装Linux操作系统.那是第一步,有了Linux操作系统,我 ...

随机推荐

  1. Spring Cache 源码解析

    这个类实现了Spring的缓存拦截器 org.springframework.cache.interceptor.CacheInterceptor @SuppressWarnings("se ...

  2. Android——列表视图 ListView(一)Arrayadapter

    一.ArrayAdapter 只显示文字 activitylistview_layout.xml <?xml version="1.0" encoding="utf ...

  3. ansible result.stdout.find('running') != -1 判断状态

    [root@m01 ansible-playbook]# cat test_1103.yml ---- hosts: webserver  tasks:    - file: path=/tmp/{{ ...

  4. 可变长度子网掩码(VLSM)在子网划分中的应用

    在学习可变长度子网掩码时,必须先熟练掌握二进制与十进制的转化.计算机中数据的单位(字节.位)等知识. 一.什么是可变长度子网掩码? 要理解可变长度子网掩码,先要理解子网掩码:要理解子网掩码,先要理解I ...

  5. lambda小结

    新公司用Java8,所以搜了下文档,发现其主要是两个概念:Lambda表达式和函数式接口. Lambda是一段可执行的代码(类似匿名函数). Lambda的设计者们为了让Java现有的体系与Lambd ...

  6. 第二百九十九节,python操作redis缓存-SortSet有序集合类型,可以理解为有序列表

    python操作redis缓存-SortSet有序集合类型,可以理解为有序列表 有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值, ...

  7. e663. 在gif图像中获取透明和色彩的数量

    A IndexColorModel is used to represent the color table of a GIF image. // Get GIF image Image image ...

  8. 使用ffmpeg的av_read_frame,如何控制连接超时

    最近使用ffmpeg来做一个rtsp的客户端,这过程也遇到不少问题,不过相应都比较好,一路走下来.不过到项目结尾时,且遇到一个比较纠结的问题.那就是客户端在使用的过程中,把rtsp服务器的网断了.这时 ...

  9. (转载)UTF-8和GBK的编码方式的部分知识:重要

    GBK的文字编码是双字节来表示的,即不论中.英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1. 至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节) ...

  10. php date strtotime的用法

    1.上个月第一天及最后一天. echo date('Y-m-01', strtotime('-1 month')); echo strtotime(date('Y-m-01 0:00:00', str ...