As far as a way to use a genrule to copy a bunch of files, glob + a list comprehension should work. Something along the lines of:
files = glob(['the_directory/**'])
genrule(
name = 'copy_the_files',
srcs = files,
outs = [f.replace('the_directory', 'another_place/folder') for f in files],
cmd = '\n'.join(['mkdir -p $$(dirname $(location %s)) && cp $(location %s) $(location :%s)' % (f, f, f.replace('the_directory', 'another_place/folder')) for f in files]),
)
Depending on exactly what you're doing, writing that (or at least the part that does the actual renaming) as a skylark macro and/or putting the output names in a separate list and using zip when generating the cmd to avoid duplicating that logic might make sense.