要生成大量隨機(jī)大小的文件您没,最簡單的方法是for循環(huán)N次菌瘪。
例如份殿,生成100W個0-16K大小的小文件(嘗試時請改小一點(diǎn)數(shù)量耸黑,不然時間要很久):
tmp_dir=/tmp/temp
for i in {1..1000000};do
dd if=/dev/zero of=$tmp_dir/${i}.log bs=`shuf -n 1 -i 0-16`k count=1 &>/dev/null
done
這里使用dd命令從/dev/zero中取數(shù)據(jù)填充小文件玷室,其中tmp_dir變量是存放大量小文件的目錄零蓉,文件的隨機(jī)大小由shuf命令生成。
但是這樣會非常的慢穷缤,不僅占用大量IO敌蜂,操作系統(tǒng)還繁忙地open、close文件描述符津肛。這樣的創(chuàng)建方式效率極低章喉。
為了不頻繁open、close文件描述符,可以直接將創(chuàng)建的文件放進(jìn)壓縮包中秸脱,比如cpio落包、tar(但不要加數(shù)據(jù)壓縮功能,如zip摊唇、xz等咐蝇,因為壓縮會占用大量cpu進(jìn)行計算),等給定數(shù)量的文件創(chuàng)建完后再解壓這個壓縮包巷查。這種方式在shell中實現(xiàn)起來比較復(fù)雜有序。
更好的方式是使用split命令,它可以將文件按給定大小均勻切分成小文件岛请。這里可以使用/dev/zero作為數(shù)據(jù)源旭寿。
因為split只能切分成等大小的文件,所以大小無法隨機(jī)崇败,只能在一定數(shù)量的循環(huán)下盅称,多次切分成等隨機(jī)大小的文件。正如下面的for和shuf僚匆。
tmp_dir=/tmp/temp
for i in {1..100};do
dd bs=10000 count=8192 if=/dev/zero |\
split -b `shuf -n 1 -i 1-16`k -a 5 -d - "$tmp_dir/$i-"
done
每次循環(huán)中微渠,dd每次生成8192*10000=8.2M的數(shù)據(jù)源,這8.2M的數(shù)據(jù)供split進(jìn)行分割咧擂,分隔的每個文件都由shuf
確定逞盆,比如某次shuf的值為5,那么8.2M的數(shù)據(jù)全部切分成5k大小的文件共16000個小文件松申。這樣的操作循環(huán)100次云芦。
這樣的方式非常快贸桶,但是只循環(huán)了100次舅逸,shuf的隨機(jī)數(shù)分配不夠均勻,所以無法控制文件的數(shù)量皇筛,比如上面的命令可能會生成200W個文件琉历,如果運(yùn)氣差可能生成400W個文件。
改成下面的水醋,循環(huán)次數(shù)增加一些旗笔,每次數(shù)據(jù)源大小小一點(diǎn):
for i in {1..10000};do
dd bs=100 count=8192 if=/dev/zero |\
split -b `shuf -n 1 -i 1-16`k -a 3 -d - "$i-"
done
生成100W個文件大概需要5分鐘(普通固態(tài)下)。同樣的拄踪,文件數(shù)量不可控制蝇恶。
本文原創(chuàng)地址在博客園:https://www.cnblogs.com/f-ck-need-u/p/10504962.html