Jak wygenerować losowy plik wypełniony losową liczbą lub charakterem w skrypcie powłoki? Chcę również określić rozmiar pliku.wygenerować losowy plik przy użyciu skryptu powłoki
Odpowiedz
Użyj polecenia dd
do odczytu danych z/dev/random.
dd if=/dev/random of=random.dat bs=1000000 count=5000
Oznacza to 5000 bloków o wielkości 1 MB losowych danych, czyli 5 gigabajtów losowych danych!
Eksperymentuj z argumentem bloku, aby uzyskać optymalną wydajność.
zmiennej losowej daje inny numer za każdym razem:
echo $RANDOM
head -c 10 /dev/random > rand.txt
zmianę 10 do czegokolwiek. Przeczytaj "man random" dla różnic między/dev/random i/dev/urandom.
Albo na tylko znaki Base64
head -c 10 /dev/random | base64 | head -c 10 > rand.txt
W base64 może zawierać pewne znaki, które nie są zainteresowane, ale nie miał czasu, aby wymyślić lepszy konwerter postaci pojedynczej wkładki ... (również bierzemy zbyt wiele bajtów z/dev/random Niestety, entropii basenie.!)
oops, brakowało znaków i cyfr, domyślam się, że masz na myśli znaki alfanumeryczne ... musisz je poprawić. –
Zapisywanie entropii: najnowszy trend ekologicznego życia egologów. :) –
dobrym początkiem byłoby:
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
Zapisz jako "script.sh", uruchom jako ./script.sh SIZE. Kod printf został usunięty z http://mywiki.wooledge.org/BashFAQ/071. Oczywiście, możesz zainicjować tablicę mycharów za pomocą brutalnej siły, mychars = ("0" "1" ... "A" ... "Z" "a" ... "z"), ale to by nie być zabawą, prawda?
#!/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
Podejście/dev/random i base64 jest również dobre, zamiast przepuszczania przez base64, przepuszczanie przez "tr -d -c [: alnum:]", wystarczy policzyć dobre znaki, które pojawią się do momentu gotowe. – nortally
Tworzenie 100 losowo nazwach plików w rozmiarze 50MB każda:
for i in `seq 1 100`; do echo $i; dd if=/dev/urandom bs=1024 count=50000 > `echo $RANDOM`; done
Lepiej używać mktemp do tworzenia losowych plików. dla i w seq 1 100; do myfile = 'mktemp --tmpdir = .' dd jeśli =/dev/urandom bs = 1024 count = 50000> $ myfile zrobione –
Jakie znaki są dozwolone w pliku wyjściowego? dowolny losowy bajt lub po prostu ascii alfanumeryczne? –