使用Shell脚本生成随机文件

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

输出文件中允许使用哪些字符?是任意随机字节还是只有ASCII字母数字字节? - Amitay Dobo
6个回答

21

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

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

这将读取5000个1MB大小的随机数据块,也就是整整5GB的随机数据!

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


dd -bs=1024 count=1 if=/dev/random of=test 它没有生成我想要的正确文件大小... - Progress Programmer
@Tadeusz:如果想要使用MiB,通常应该使用bs=1M,而不是MB。 - wRAR
在第二次阅读问题后,我认为他也想将字符(猜测字母)和数字保存到文件中。 - Amitay Dobo
7
如果需要这么多的“随机性”,那么那个dd命令不太可能完成,因为不会有5GB的熵可用。如果需要,请使用/dev/urandom。 - camh

8
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 中取了太多字节。对不起,熵池!)


哎呀,我错过了字母和数字的部分,我猜你是指字母数字字符...需要修订。 - Amitay Dobo
1
保存熵:生态学家绿色生活的最新趋势。 :) - Tadeusz A. Kadłubowski

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

1
创建100个大小为50MB的随机命名文件:
for i in `seq 1 100`; do echo $i; dd if=/dev/urandom bs=1024 count=50000 > `echo $RANDOM`; done


最好使用mktemp创建随机文件。for i in seq 1 100; do myfile=mktemp --tmpdir=. dd if=/dev/urandom bs=1024 count=50000 > $myfile done - Steve K

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

/dev/random及base64的方法也不错,不过可以通过“tr -d -c [:alnum:]”进行管道传输,然后只需要计算输出的好字符数即可。 - nortally

0

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

echo $RANDOM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接