linux 生成随机文件,如何在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< file.txt

X为随机文件需要的行数,Y为从words中读取的单词,虽说组合成一句的命令,还是可以读懂的;从标准输入中重复读取Y个单词,写入到b列表中,然后再通过join空格连接内容写入到标准输出文件file.txt中

这样基本很少会有重复的行了,而且生成的效率与其他方法对比还是可以的,10秒生成100Mb文件。欢迎大家讨论。

参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的问题,需要一步一步来。首先,我们需要确定使用什么编程语言来实现这个需求。在这里,我选择使用C++语言。 接下来,我们需要安装一个编译器来编译我们的C++程序。在Linux下,常用的编译器有gcc和g++等。这里,我选择使用g++。 首先,我们需要安装g++,可以在命令行中输入以下命令来安装: ``` sudo apt-get update sudo apt-get install g++ ``` 安装完成后,我们就可以开始编写程序了。以下是一个简单的示例代码: ```c++ #include <iostream> #include <vector> #include <thread> #include <algorithm> using namespace std; void sort(vector<int>& nums) { sort(nums.begin(), nums.end()); } int main() { // 生成随机整数 vector<int> nums(10000000); for (int i = 0; i < 10000000; i++) { nums[i] = rand(); } // 将整数分成4份,每份使用一个线程进行排序 vector<thread> threads(4); for (int i = 0; i < 4; i++) { threads[i] = thread(sort, vector<int>(nums.begin() + i * 2500000, nums.begin() + (i + 1) * 2500000)); } // 等待所有线程结束 for (int i = 0; i < 4; i++) { threads[i].join(); } // 将4份已排序的整数合并 vector<int> result(10000000); merge(nums.begin(), nums.begin() + 2500000, nums.begin() + 2500000, nums.begin() + 5000000, result.begin()); merge(nums.begin() + 5000000, nums.begin() + 7500000, nums.begin() + 7500000, nums.end(), result.begin() + 5000000); merge(result.begin(), result.begin() + 5000000, result.begin() + 5000000, result.end(), nums.begin()); // 输出排序后的整数 for (int i = 0; i < 10000000; i++) { cout << nums[i] << " "; } cout << endl; return 0; } ``` 这个程序会生成1000万个随机整数,将它们分成4份,每份使用一个线程进行排序,最后将4份已排序的整数合并成一个有序的序列。 接下来,我们需要使用g++编译我们的程序。在命令行中进入程序所在的目录,输入以下命令进行编译: ``` g++ -std=c++11 -pthread -o sort sort.cpp ``` 其中,`-std=c++11`表示使用C++11标准,`-pthread`表示使用多线程库。 编译完成后,我们可以使用以下命令来运行程序: ``` ./sort ``` 如果一切顺利,应该可以看到程序输出了排序后的整数序列。 希望这个回答对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值