Existe uma maneira de executar uma comparação recursiva de dois diretórios, mas apenas comparar (em seus respectivos locais) arquivos que correspondam a um predicado específico de nome de arquivo ou tipo de arquivo?
Por exemplo, eu gostaria de fazer algo como
diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml
... ou melhor ainda:
diff -r dir-a dir-b -filetype text
Claramente, não é obrigatório usá-lo, diff
pois suponho que um encantamento find
e -exec diff
também possa fazer o truque (simplesmente não sei como gerar os caminhos de arquivo complementares no último caso).
command-line
find
diff
Marcus Junius Brutus
fonte
fonte
Respostas:
Shellscript
differ-r
Esse shellscript pode executar uma comparação recursiva de dois diretórios, mas apenas comparar (em seus respectivos locais) arquivos que correspondam a um nome de arquivo ou padrão de tipo de arquivo específico.
Demo
Arquivos:
Uso:
Em execução
differ-r
:As
diff
linhas de comando executadas são impressas com texto verde e a saída, quando não há correspondência, é impressa com texto padrão (branco em preto na captura de tela a seguir).rsync
com filtroSe você não precisar obter nenhuma saída que descreva a diferença, saiba apenas quais arquivos estão diferentes ou ausentes (para que
rsync
eles desejem copiá-los), você pode usar a seguinte linha de comando.Demo
Se você deseja uma saída limpa, sem comentar linhas e sem diretórios, é possível que
grep
a saída seja assim,Shellscript
rsync-diff
Esse one-liner pode ser transformado no comando principal de um shellscript
rsync-diff
.fonte
Como você mencionou "Claramente, não é obrigatório usar o diff",
Isso deve fazer o trabalho para você mesclar facilmente configurável para que tipo de arquivos ignorar:
além disso, outra alternativa seria escrever um script simples que será transferido de uma lista branca para uma lista negra e, posteriormente, a lista negra será passada para o diff com a
--exclude
opçãofonte
Com a substituição do comando de suporte ao shell, você pode usar o seguinte recurso (como já observado por @JammingThebBits):
Funciona assim:
find
procure os arquivos que não são do seu interesse,sed
extraia o nome da base (a execuçãobasename
é extremamente lenta se você tiver muitos arquivos) e os coloca em um arquivo temporário ; esse arquivo é passado paradiff
pedir para excluí-los da comparação (exclusão dupla = inclusão).Se você não tiver substituição de comando, coloque a
sed
saída em um arquivo e passe-a explicitamentediff
.No exemplo, procurei apenas arquivos XML e JAVA, altere-os conforme necessário, separando-os com OR.
fonte