Difira entre dois diretórios e mantenha apenas os inalterados

5

Eu preciso diferenciar dois diretórios:

 A: /path1/
 B: /path2/
  1. O diretório A contém todos os arquivos e subdiretórios que também estão contidos em B.
  2. Os arquivos em A (e em seus subdiretórios) podem ter diferentes conteúdos dos arquivos equivalentes em B.
  3. O diretório A (e seus subdiretórios) também possui arquivos extras que não existem em B.

O que eu gostaria de alcançar é:

  • Mantenha apenas os arquivos em A que diferem dos arquivos em B, além de todos os arquivos extras que não existem em B.
  • Exclua todos os outros arquivos em A que não respeitam a regra anterior.
por Leonardo 05.03.2013 / 17:11

1 resposta

6

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 {} \; executa rmdir -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.

    
por 05.03.2013 / 17:31

Tags