【发布时间】:2010-04-06 17:53:08
【问题描述】:
如何在 shell 脚本中生成一个随机数或字符填充的随机文件?我还想指定文件的大小。
【问题讨论】:
-
输出文件中允许使用哪些字符?任何随机字节或只是 ascii 字母数字字节?
如何在 shell 脚本中生成一个随机数或字符填充的随机文件?我还想指定文件的大小。
【问题讨论】:
使用dd 命令从/dev/random 读取数据。
dd if=/dev/random of=random.dat bs=1000000 count=5000
这将读取 5000 个 1MB 的随机数据块,即整整 5 GB 的随机数据!
使用块大小参数进行实验以获得最佳性能。
【讨论】:
head -c 10 /dev/random > rand.txt
将 10 更改为任何值。阅读“man random”了解 /dev/random 和 /dev/urandom 之间的区别。
或者,仅适用于 base64 字符
head -c 10 /dev/random | base64 | head -c 10 > rand.txt
base64 可能包含一些您不感兴趣的字符,但没有时间想出更好的单行字符转换器... (我们也从 /dev/random 中获取了太多字节。抱歉,熵池!)
【讨论】:
一个好的开始应该是:
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
【讨论】:
创建 100 个随机命名的文件,每个文件大小为 50MB:
for i in `seq 1 100`; do echo $i; dd if=/dev/urandom bs=1024 count=50000 > `echo $RANDOM`; done
【讨论】:
mktemp --tmpdir=.dd if=/dev/urandom bs=1024 count=50000 > $myfile done
RANDOM 变量每次都会给你一个不同的数字:
echo $RANDOM
【讨论】:
另存为“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
【讨论】: