Essa abordagem deve funcionar:
cd /path1
find . -type f -exec cmp -s {} /path2/{} \; -delete
Como funciona:
-
find . -type f
passa por todos os arquivos no diretório atual ( A ) e em seus subdiretórios. -
cmp -s {} /path2/{}
silenciosamente (-s
) compara o arquivo atualmente processado ({}
) com o arquivo correspondente em B (/path2/{}
). -
Se os arquivos forem idênticos, cmp retornará true e a condição
-exec
será correspondente. -
Se a condição
-exec
corresponder,-delete
excluirá o arquivo.
Sugiro substituir -delete
por -print
antes de executar o comando real para verificar se ele funciona como esperado.
Para lidar com diretórios vazios restantes, você pode executar o comando:
find . -type d -exec rmdir -p {} \; 2> /dev/null
-
-type d
só encontra diretórios. -
-exec rmdir -p {} \;
executarmdir -p {}
para cada diretório encontrado.{}
é o diretório que foi encontrado, e a opção-p
faz o rmdir remover seus diretórios pai vazios também. -
2> /dev/null
suprime as mensagens de erro que surgirão ao tentar excluir diretórios não vazios ou excluídos anteriormente.
Como o rmdir não pode excluir diretórios não vazios, essa deve ser a maneira mais segura.