mv
não pode mesclar ou sobrescrever diretórios, ele falhará com a mensagem "mv: não pode mover 'a' para 'b': Diretório não vazio" , mesmo quando você estiver usando o --force
opção.
Você pode contornar isso usando outras ferramentas (como rsync
, find
ou mesmo cp
), mas é necessário considerar cuidadosamente as implicações:
-
rsync
pode mesclar o conteúdo de um diretório em outro (idealmente com a opção--remove-source-files
1 para excluir com segurança apenas os arquivos de origem que foram transferidos com êxito e com a permissão / propriedade / preservação de horário usual opção-a
se desejar)
… mas esta é uma operação de cópia completa e pode, portanto, ser muito intensiva em disco. -
Você pode usar
find
para recriar sequencialmente a estrutura de diretórios de origem no destino e, em seguida, mover individualmente os arquivos reais < br> … mas isso tem que recorrer pela origem várias vezes e pode encontrar condições de corrida (novos diretórios sendo criados na origem durante o processo de várias etapas) -
cp
pode criar links físicos (basta inserir ponteiros adicionais para o mesmo arquivo existente), o que cria um resultado muito semelhante a uma mesclagemmv
(e é muito eficiente em termos de IO, pois somente os ponteiros são criados e nenhum dado real deve ser copiado)
… mas isso novamente sofre de uma possível condição de corrida (novos arquivos na origem sendo excluídos mesmo que não tenham sido copiados na etapa anterior)
Quais dessas soluções alternativas (se houver) serão apropriadas dependerão muito do seu caso de uso específico.
Como sempre, pense antes de executar qualquer um desses comandos e tenha backups.
1: Observe que rsync --remove-source-files
não excluirá nenhum diretório, então você terá que fazer algo como find -type d -empty -delete
depois para se livrar da árvore de diretórios de fontes vazias.