205 lines
4.5 KiB
Bash
Executable File
205 lines
4.5 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# SCRIPT: random_file.bash
|
|
# AUTHOR: Randy Michael
|
|
# DATE: 8/3/2007
|
|
# REV: 1.0
|
|
# PLATFORM: Not Platform Dependent
|
|
#
|
|
# PURPOSE: This script is used to create a
|
|
# specific size file of random characters.
|
|
# The methods used in this script include
|
|
# loading an array with alphanumeric
|
|
# characters, then using the /dev/random
|
|
# character special file to seed the RANDOM
|
|
# shell variable, which in turn is used to
|
|
# extract a random set of characters from the
|
|
# KEYS array to build the OUTFILE of a
|
|
# specified MB size.
|
|
#
|
|
# set -x # Uncomment to debug this script
|
|
#
|
|
# set -n # Uncomment to check script syntax
|
|
# # without aby execution. Do not forget
|
|
# # to put the comment back in or the
|
|
# # script will never execute.
|
|
#
|
|
##########################################
|
|
# DEFINE FILES AND VARIABLES HERE
|
|
##########################################
|
|
|
|
typeset -i MB_SIZE=$1
|
|
typeset -i RN
|
|
typeset -i i=1
|
|
typeset -i X=0
|
|
WORKDIR=/scripts
|
|
OUTFILE=${WORKDIR}/largefile.random.txt
|
|
>$OUTFILE
|
|
THIS_SCRIPT=$(basename $0)
|
|
CHAR_FILE=${WORKDIR}/char_file.txt
|
|
|
|
##########################################
|
|
# DEFINE FUNCTIONS HERE
|
|
##########################################
|
|
|
|
build_random_line ()
|
|
{
|
|
# This function extracts random characters
|
|
# from the KEYS array by using the RANDOM
|
|
# shell variable
|
|
|
|
C=1
|
|
LINE=
|
|
until (( C > 79 ))
|
|
do
|
|
LINE="${LINE}${KEYS[$(($RANDOM % X + 1))]}"
|
|
(( C = C + 1 ))
|
|
done
|
|
|
|
# Return the line of random characters
|
|
|
|
echo "$LINE"
|
|
}
|
|
|
|
##########################################
|
|
|
|
elasped_time ()
|
|
{
|
|
SEC=$1
|
|
|
|
(( SEC < 60 )) && echo -e "[Elasped time: \
|
|
$SEC seconds]\c"
|
|
|
|
(( SEC >= 60 && SEC < 3600 )) && echo -e \
|
|
"[Elasped time: $(( SEC / 60 )) min $(( SEC % 60 )) sec]\c"
|
|
|
|
(( SEC > 3600 )) && echo -e "[Elasped time: \
|
|
$(( SEC / 3600 )) hr $(( (SEC % 3600) / 60 )) min \
|
|
$(( (SEC % 3600) % 60 )) sec]\c"
|
|
}
|
|
|
|
##########################################
|
|
|
|
load_default_keyboard ()
|
|
{
|
|
# Loop through each character in the following list and
|
|
# append each character to the $CHAR_FILE file. This
|
|
# produces a file with one character on each line.
|
|
|
|
for CHAR in 1 2 3 4 5 6 7 8 9 0 q w e r t y u i o \
|
|
p a s d f g h j k l z x c v b n m \
|
|
Q W E R T Y U I O P A S D F G H J K L \
|
|
Z X C V B N M 0 1 2 3 4 5 6 7 8 9
|
|
do
|
|
echo "$CHAR" >> $CHAR_FILE
|
|
done
|
|
}
|
|
##########################################
|
|
|
|
usage ()
|
|
{
|
|
echo -e "\nUSAGE: $THIS_SCRIPT Mb_size"
|
|
echo -e "Where Mb_size is the size of the file to build\n"
|
|
}
|
|
|
|
##########################################
|
|
# BEGINNING OF MAIN
|
|
##########################################
|
|
|
|
if (( $# != 1 ))
|
|
then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
# Test for an integer value
|
|
|
|
case $MB_SIZE in
|
|
[0-9]) : # Do nothing
|
|
;;
|
|
*) usage
|
|
;;
|
|
esac
|
|
|
|
# Test for the $CHAR_FILE
|
|
|
|
if [ ! -s "$CHAR_FILE" ]
|
|
then
|
|
echo -e "\nNOTE: $CHAR_FILE does not esist"
|
|
echo "Loading default keyboard data."
|
|
echo -e "Creating $CHAR_FILE...\c"
|
|
load_default_keyboard
|
|
echo "Done"
|
|
fi
|
|
|
|
# Load Character Array
|
|
|
|
echo -e "\nLoading array with alphanumeric character elements"
|
|
|
|
while read ARRAY_ELEMENT
|
|
do
|
|
(( X = X + 1 ))
|
|
KEYS[$X]=$ARRAY_ELEMENT
|
|
|
|
done < $CHAR_FILE
|
|
|
|
echo "Total Array Character Elements: $X"
|
|
|
|
# Use /dev/random to seed the shell variable RANDOM
|
|
|
|
echo "Querying the kernel random number generator for a random seed"
|
|
|
|
RN=$(dd if=/dev/random count=1 2>/dev/null \
|
|
| od -t u4 | awk '{print $2}'| head -n 1)
|
|
|
|
# The shell variable RANDOM is limited to 32767
|
|
|
|
echo "Reducing the random seed value to between 1 and 32767"
|
|
|
|
RN=$(( RN % 32767 + 1 ))
|
|
|
|
# Initialize RANDOM with a new seed
|
|
|
|
echo "Assigning a new seed to the RANDOM shell variable"
|
|
|
|
RANDOM=$RN
|
|
|
|
echo "Building a $MB_SIZE MB random character file ==> $OUTFILE"
|
|
echo "Please be patient, this may take some time to complete..."
|
|
echo -e "Executing: .\c"
|
|
|
|
# Reset the shell SECONDS variable to zero seconds.
|
|
|
|
SECONDS=0
|
|
|
|
TOT_LINES=$(( MB_SIZE * 12800 ))
|
|
|
|
until (( i > TOT_LINES ))
|
|
do
|
|
build_random_line >> $OUTFILE
|
|
(( $(( i % 100 )) == 0 )) && echo -e ".\c"
|
|
(( i = i + 1 ))
|
|
done
|
|
|
|
# Capture the total seconds
|
|
|
|
TOT_SEC=$SECONDS
|
|
|
|
echo -e "\n\nSUCCESS: $OUTFILE created at $MB_SIZE MB\n"
|
|
|
|
elasped_time $TOT_SEC
|
|
|
|
# Calculate the bytes/second file creation rate
|
|
|
|
(( MB_SEC = ( MB_SIZE * 1024000 ) / TOT_SEC ))
|
|
|
|
echo -e "\n\nFile Creation Rate: $MB_SEC bytes/second\n"
|
|
|
|
echo -e "File size:\n"
|
|
ls -l $OUTFILE
|
|
echo
|
|
|
|
##########################################
|
|
# END OF random_file.bash SCRIPT
|
|
##########################################
|