如何在Linux系統經過命令行生成隨機文件

版權聲明:本文由胡恆威原創文章,轉載請註明出處: 
文章原文連接:https://www.qcloud.com/community/article/86html

來源:騰雲閣 https://www.qcloud.com/communitylinux

 

是否會有這樣的場景:在有須要測試數據的時候,你不知如何生成一些已包含測試數據的文件;或者你是臨時須要一個小的程序,可讓你生成不一樣大小的文件(好比大於1Mb少於100Mb),不須要從網絡上去搜尋查找如何生成,這裏有一些簡單的方法幫你偷懶。ruby

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

2.當你不須要關心隨機文件的內容,但指望測試文件能有統計的行

/dev/zero改成/dev/urandom/dev/urandom是linux下的隨機數生成器dom

關於/dev/urandom/dev/random二者的區別就不在此詳細討論,大概就是,前者是不受系統interrupts的限制,即便沒有足夠的interrupt它也能經過隨機數生成器產生足夠的輸出值;然後者若是用在dd上,它不能被ctrl+c或者kill -9中斷,若是ds的值較大時,產生的隨機值不足而長期佔用CPU。雖說/dev/random產生的隨機數會更隨機些,但與dd混用仍是建議用/dev/urandom效率更高。測試

缺點跟/dev/zero比固然是效率會更低些了,生成個100Mb的文件須要10秒左右,並且文件並無可讀的內容,通常的狀況基本上是知足了。spa

漏了說句,dd是linux與unix都支持的指令。操作系統

3.當你關心文件的隨機內容行數,而不關心內容是否有所重複

這裏的思路就是找一個參照文件(好比說2行),將文件從新定向到新的文件,再mv覆蓋保存,外加一個for循環。(n爲循環次數,產生的文件行爲2^(n+1))unix

例子:假設先創建一個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)

相關文章
相關標籤/搜索