hon, ох какой неподходящий инструмент для brute force выбрали. Посмотрите на C/C++ и CUDA, если на компе Nvidia карточка или OpenCL, если не Nvidia карточка. А ещё про параллельные вычисления почитайте теорию. Ваша задача очень хорошо разбивается на кучу потоков.
Если совсем простой пароль, а перебирать мало и уж очень хочется на BASH это делать, то используйте GNU Parallel.
Вот пример скрипта (обрабатываю им картинки для сайтов, сжатие без потерь сторонними утилитами в кучу потоков по несколько картинок сразу), возможно поможет разобраться с вашей задачей.
#!/bin/bash
opt_optipng ()
{
input="$1"
echo "Обрабатывается: (optipng) $input"
optipng0.7.4 -o3 "$input" >/dev/null 2>&1
}
opt_advpng ()
{
input="$1"
echo "Обрабатывается (advpng): $input"
advpng -z -4 "$input">/dev/null 2>&1
}
opt_advdef ()
{
input="$1"
echo "Обрабатывается (advdef): $input"
advdef -z -4 "$input">/dev/null 2>&1
}
opt_jpegtran ()
{
input="$1"
echo "Обрабатывается: $input"
jpegtran -optimize -progressive -copy none -outfile "$input" "$input" 2>&1
}
opt_gifsicle ()
{
input="$1"
echo "Обрабатывается (gifsicle): $input"
gifsicle --batch --optimize=3 "$input" >/dev/null 2>&1
}
SIZEPNG=$(find . -type f \( -iname '*.png' -o -iname '*.PNG' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}');
SIZEGIF=$(find . -type f \( -iname '*.gif' -o -iname '*.GIF' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}');
SIZEJPG=$(find . -type f \( -iname '*.JPG' -o -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.JPEG' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}')
SIZE=$[SIZEPNG+SIZEGIF+SIZEJPG]
export -f opt_optipng
find -type f | cut -c 3- | grep -ie '.png$' | sort | parallel opt_optipng '{}'
export -f opt_advpng
find -type f | cut -c 3- | grep -ie '.png$' | sort | parallel opt_advpng '{}'
export -f opt_advdef
find -type f | cut -c 3- | grep -ie '.png$' | sort | parallel opt_advdef '{}'
export -f opt_jpegtran
find -type f | cut -c 3- | grep -e '.JPG$' -e '.jpg$' -e '.jpeg$' -e '.JPEG$' | sort | parallel opt_advdef '{}'
export -f opt_gifsicle
find -type f | cut -c 3- | grep -ie '.gif$' | parallel opt_gifsicle '{}'
echo "Готово!"
SIZEPNG2=$(find . -type f \( -iname '*.png' -o -iname '*.PNG' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}');
SIZEGIF2=$(find . -type f \( -iname '*.gif' -o -iname '*.GIF' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}');
SIZEJPG2=$(find . -type f \( -iname '*.JPG' -o -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.JPEG' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}')
SIZE2=$[SIZEPNG2+SIZEGIF2+SIZEJPG2]
if [ $SIZEPNG ]; then
PERCENTPNG=$[100-SIZEPNG2*100/SIZEPNG]
fi
if [ $SIZEGIF ]; then
PERCENTGIF=$[100-SIZEGIF2*100/SIZEGIF]
fi
if [ $SIZEJPG ]; then
PERCENTJPG=$[100-SIZEJPG2*100/SIZEJPG]
fi
if [ $SIZE ]; then
PERCENT=$[100-SIZE2*100/SIZE]
echo "Исходный размер всех обрабатываемых файлов был $SIZE байт а после обработки составил $SIZE2 байт. Среднее сжатие на $PERCENT%
Из них:"
fi
if [ $SIZEPNG ]; then
echo "PNG: было: $SIZEPNG байт, стало $SIZEPNG2 байт, сжалось на $PERCENTPNG%"
fi
if [ $SIZEGIF ]; then
echo "GIF: было: $SIZEGIF байт, стало $SIZEGIF2 байт, сжалось на $PERCENTGIF%"
fi
if [ $SIZEJPG ]; then
echo "JPG: было: $SIZEJPG байт, стало $SIZEPJPG байт, сжалось на $PERCENTJPG%"
fi
Узнать количество ядер CPU можно командой
grep ^processor /proc/cpuinfo | wc -l
А вафли ломать противозаконно. Тем более изначально подход и выбор инструментов неверен.