Se você iniciar a partir do diretório pai, poderá fazer isso com find e GNU cp . Supondo que o diretório em que você está atualmente (aquele que contém tmp ) seja chamado de folder e que tmp esteja vazio, você executaria
cd ..
find . -path ./folder/tmp -prune -o -type f -exec cp --parents -t folder/tmp {} +
Isso pede para encontrar listar tudo em . (que é seu antigo .. ), excluí-lo se corresponder a ./folder/tmp e, caso contrário, um arquivo passará para cp com a opção --parents (que diz cp para reconstruir a hierarquia de fontes).
Se tmp já tiver arquivos que também precisem ser copiados, a seguinte variante será um pouco menos Unix-y (já que usa moreutils ' sponge ), mas evita pular o conteúdo de tmp :
cd ..
find . -type f -print0 | sponge | xargs -0 cp --parents -t folder/tmp
Você pode evitar o uso de sponge salvando a lista de arquivos para copiar em um arquivo em outro lugar (mas as coisas ficam bem menos elegantes):
cd ..
find . -type f -print0 > /tmp/filelist
xargs -0 cp --parents -t folder/tmp < /tmp/filelist
rm /tmp/filelist
Você pode evitar o requisito sobre o% GNUcp usando cpio :
cd ..
find . -type f -print0 > /tmp/filelist
cpio -pmd0 folder/tmp < /tmp/filelist
rm /tmp/filelist
ou
cd ..
find . -type f -print0 | sponge | cpio -pmd0 folder/tmp
Se tmp estiver vazio, você também pode evitar o requisito em moreutils :
cd ..
find . -path ./folder/tmp -prune -o -type f -print0 | cpio -pmd0 folder/tmp