Do you want a matching tree, or all in one dir (who wins on name collisions?). Do we need to worry about the command line length? They say any fool can code, but it takes some thought to write requirements. For one dir (last wins):
find * -name '*.sh' -type f | xargs -n101 echo | while read mf
do
cp $mf <destination>
done
Narrative: Find the files one per line, use xargs to echo them out in larger groups (up to 101) on one line, cp each multi-file group to the destination. This has 99+% economy of scale on cp calls but still starts cp long before find is done.
For same subtree:
find * -name '*.sh' -type f | cpio -pd <destination>
If you are copying within the same device (mount), don't want to rewrite them and care about space, you can hard link with 'ln' in place of 'cp'.