使用shell脚本生成随机文件

时间:2010-04-06 17:53:08

标签: shell scripting test-data

如何在shell脚本中生成随机数字或字符填充的随机文件?我还想指定文件的大小。

6 个答案:

答案 0 :(得分:18)

使用dd命令从/ dev / random读取数据。

dd if=/dev/random of=random.dat bs=1000000 count=5000

这将读取5000个1MB的随机数据块,即整整5千兆字节的随机数据!

尝试使用blocksize参数来获得最佳性能。

答案 1 :(得分:7)

head -c 10 /dev/random > rand.txt

将10变为任何东西。对于/ dev / random和/ dev / urandom之间的差异,请阅读“man random”。

或者,仅限base64个字符

head -c 10 /dev/random | base64 | head -c 10 > rand.txt

base64可能包含一些你不感兴趣的角色,但没有时间想出一个更好的单行角色转换器...... (我们从/ dev / random中获取太多字节。抱歉,熵池!)

答案 2 :(得分:3)

一个好的开始是:

http://linuxgazette.net/153/pfeiffer.html

#!/bin/bash
# Created by Ben Okopnik on Wed Jul 16 18:04:33 EDT 2008

########    User settings     ############
MAXDIRS=5
MAXDEPTH=2
MAXFILES=10
MAXSIZE=1000
######## End of user settings ############

# How deep in the file system are we now?
TOP=`pwd|tr -cd '/'|wc -c`

populate() {
    cd $1
    curdir=$PWD

    files=$(($RANDOM*$MAXFILES/32767))
    for n in `seq $files`
    do
        f=`mktemp XXXXXX`
        size=$(($RANDOM*$MAXSIZE/32767))
        head -c $size /dev/urandom > $f
    done

    depth=`pwd|tr -cd '/'|wc -c`
    if [ $(($depth-$TOP)) -ge $MAXDEPTH ]
    then
        return
    fi

    unset dirlist
    dirs=$(($RANDOM*$MAXDIRS/32767))
    for n in `seq $dirs`
    do
        d=`mktemp -d XXXXXX`
        dirlist="$dirlist${dirlist:+ }$PWD/$d"
    done

    for dir in $dirlist
    do
        populate "$dir"
    done
}

populate $PWD

答案 3 :(得分:1)

创建100个随机命名的文件,每个文件大小为50MB:

for i in `seq 1 100`; do echo $i; dd if=/dev/urandom bs=1024 count=50000 > `echo $RANDOM`; done

答案 4 :(得分:0)

RANDOM变量每次都会给你一个不同的数字:

echo $RANDOM

答案 5 :(得分:0)

另存为“script.sh”,以./script.sh SIZE运行。 printf代码从http://mywiki.wooledge.org/BashFAQ/071解除。当然,你可以用暴力初始化mychars数组,mychars =(“0”“1”......“A”......“Z”“a”......“z”),但那不会有意思吗?是吗?

#!/bin/bash
declare -a mychars
for (( I=0; I<62; I++ )); do
    if [ $I -lt 10 ]; then
        mychars[I]=$I
    elif [ $I -lt 36 ]; then
        D=$((I+55))
        mychars[I]=$(printf \\$(($D/64*100+$D%64/8*10+$D%8)))
    else
        D=$((I+61))
        mychars[I]=$(printf \\$(($D/64*100+$D%64/8*10+$D%8)))
    fi
done
for (( I=$1; I>0; I-- )); do
     echo -n ${mychars[$((RANDOM%62))]}
done
echo