Ou mais complicado, mas com um único passe no sistema de arquivos (para uma portabilidade ainda maior, ~ deve ser escrito como $HOME )
find . \( -type d -exec mkdir -p "~/elsewhere/{}" \; \
-o -type f -exec touch "~/elsewhere/{}" \; \)
A complexidade aqui é a da lógica booleana (que pode ser de algum benefício para aprender) e precedência (também é bom saber) e como find implementa esses conceitos com um E implícito entre o -type e a ação subsequente, e OU fazendo uma aparição como -o .