Essa abordagem deve funcionar:
cd /path1
find . -type f -exec cmp -s {} /path2/{} \; -delete
Como funciona:
-
find . -type fpassa 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
-execserá correspondente. -
Se a condição
-execcorresponder,-deleteexcluirá 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 dsó encontra diretórios. -
-exec rmdir -p {} \;executarmdir -p {}para cada diretório encontrado.{}é o diretório que foi encontrado, e a opção-pfaz o rmdir remover seus diretórios pai vazios também. -
2> /dev/nullsuprime 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.