シェルスクリプトで乱数または文字で満たされたランダムファイルを生成するにはどうすればよいですか? ファイルのサイズも指定したい。
6 に答える
コマンドを使用dd
して、/dev/random からデータを読み取ります。
dd if=/dev/random of=random.dat bs=1000000 count=5000
これは、5000 個の 1MB ブロックのランダム データを読み取ることになります。つまり、5 ギガバイトのランダム データです。
最適なパフォーマンスを得るには、blocksize 引数を試してください。
head -c 10 /dev/random > rand.txt
10を何にでも変更します。/ dev/randomと/dev/ urandomの違いについては、「manrandom」をお読みください。
または、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
それぞれサイズが50MBのランダムに名前が付けられたファイルを100個作成します。
for i in `seq 1 100`; do echo $i; dd if=/dev/urandom bs=1024 count=50000 > `echo $RANDOM`; 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