Copiar um diretório parece banal até o dia em que o diretório contém arquivos ocultos, links simbólicos ou datas úteis para um script. cp -r copia a estrutura, mas cp -a é frequentemente a melhor escolha para duplicar um diretório de trabalho sem modificar seus atributos.
Antes de excluir a fonte, crie a cópia, verifique-a e abra alguns arquivos. Um comando bem-sucedido não prova que você apontou para o caminho correto.

Escolher entre cp -r e cp -a
cp -r desce nos subdiretórios. As entradas que começam com um ponto são incluídas ao copiar o diretório em si. Evite, no entanto, globbing do tipo * se você também espera os arquivos ocultos: o shell os ignora por padrão.
cp -a ativa o modo de arquivo. Ele preserva o máximo possível as permissões, proprietários, datas, links simbólicos e links físicos. Para um backup local ou uma migração de diretório, geralmente é o comando a ser priorizado. Ele pode exigir permissões elevadas se você precisar preservar um proprietário que sua conta não pode definir.
cp -a -- /srv/app/ /srv/app-copie/
O -- separa as opções dos caminhos. Ele evita que um arquivo começando com um hífen seja interpretado como uma opção. A barra final da fonte significa aqui que você está copiando seu conteúdo para /srv/app-copie/. Se esse diretório já existir, verifique a estrutura obtida antes de continuar.
Preparar um destino sem sobrescrever o diretório errado
Primeiro, crie um destino claramente nomeado e liste os dois lados. Em um servidor, não inicie uma cópia recursiva para um caminho construído manualmente em um script sem exibir esse caminho nos logs.
mkdir -p -- /srv/app-copie
find /srv/app -maxdepth 1 -printf '%fn' | sort
find /srv/app-copie -maxdepth 1 -printf '%fn' | sort
Se você quiser recusar qualquer sobrescrição durante uma primeira tentativa, adicione -n. Esta opção ignora os arquivos já presentes, portanto, não é adequada para uma sincronização completa. Para substituir dados existentes, faça um backup ou trabalhe em um novo diretório, e então mude o serviço para a cópia validada.
Controlar arquivos, permissões e links
Comece verificando os arquivos ocultos e as permissões. ls -la exibe os nomes que começam com um ponto. stat permite comparar as permissões e as datas de um arquivo sensível.
ls -la /srv/app
ls -la /srv/app-copie
stat -c '%n %a %U:%G %y' /srv/app/config.ini /srv/app-copie/config.ini
find /srv/app-copie -type l -ls
O último comando lista os links simbólicos. Com cp -a, um link normalmente continua sendo um link. Com uma cópia menos adequada, você pode acabar com o conteúdo de seu alvo ou um link se tornando inválido após o deslocamento.
- conte os arquivos com
find ... -type f | wc -l; - abra o arquivo de configuração mais importante;
- teste o programa contra a cópia antes de excluir a fonte;
- mantenha a fonte enquanto o serviço ou o script não tiver passado por seu controle funcional.
Para comparar o conteúdo de duas árvores de diretórios, diff -qr /srv/app /srv/app-copie reporta os arquivos que diferem. Isso não substitui uma validação de aplicativo, mas detecta rapidamente uma cópia incompleta.
Se você também precisar corrigir as permissões após uma duplicação, o guia sobre chmod recursivo no Linux explica por que um chmod -R lançado muito rapidamente pode quebrar executáveis. Para encontrar um arquivo antes da cópia, use também find no Linux.