#!/bin/bash
extract_archive()
{
input="$1"
#тут пишешь команду для распаковки, в переменной $input у тебя будут имена файлов на распаковку
}
export -f extract_archive
find -type f -iname '*.zip' | parallel --no-notice extract_archive '{}'
#parallel даст одновременно запускать распаковку стольких архивов, сколько ядер, если я не ошибаюсь. Ключем -j можешь задать конкретно сколько параллельно тебе надо распаковывать. Можешь выпилить parallel из этой схемы, если тебе это не надо, я так картинки обрабатываю и мне parallel нужен для ускорения, у тебя наверно жесткий будет тонким местом и тебе он не нужен.
Как-то так и никаких глупых циклов для рекурсивного поиска.
Субдиректории создавай сам и удаляй сам архивы после распаковки в функции для распаковки архива.
Обновил, забыл про export.