I needed a solution like Giles' from 2010, except I needed to preserve the folder structure, not unzip everything into the top level directory. Here's my take on his with three lines added/changed:
1 #!/bin/bash
1 shopt -s globstar nullglob
2 while set -- **/*.zip; [ $# -ge 1 ]
3 do
4 for z
5 do
6 ( cd -- "$(dirname "$z")" &&
7 z=${z##*/} &&
8 cp -- "$z" "$z".bak &&
9 mkdir -- "$z"dir &&
10 unzip -- "$z" -d "$z"dir &&
11 rm -- "$z"
12 )
13 done
14 done