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