Como diferenciar vários arquivos entre diretórios?

16

Estou tentando encontrar diff s entre todos os arquivos de mesmo nome em duas cópias de um diretório (digamos, um trabalho e um backup). Por exemplo, posso diff dois arquivos de mesmo nome em ambos:

> diff d1/f.cpp d2/f.cpp

ou posso encontrar diferenças nos diretórios:

> diff d1 d2

mas como posso encontrar diferenças apenas entre os arquivos *.cpp ?

> diff d1/*.cpp d2/*.cpp

parece não funcionar (por razões óbvias).

[É provavelmente fácil de resolver com loops, mas estou tentando encontrar uma maneira mais elegante]

    
por ysap 09.03.2012 / 15:22

4 respostas

9

Você pode usar um loop de shell que executa diff para cada arquivo, embora isso não capture os casos em que d2 contém um arquivo, mas d1 não. Pode ser o suficiente.

for file in d1/*.cpp; do
    diff "$file" "d2/${file##*/}"
done

Ou tudo em uma linha:

for file in d1/*.cpp; do diff "$file" "d2/${file##*/}"; done

A parte ${file##*/} é uma expansão de parâmetro especial.

Se a variável de arquivo contiver d1/hello.cpp , então "${file##*/}" será expandido para hello.cpp (o valor do arquivo, mas com tudo até e incluindo, o último / removido).

Portanto, "d2/${file##*/}" resultará em d2/hello.cpp e o comando resultante diff será, portanto, diff d1/hello.cpp d2/hello.cpp

Veja link para mais informações sobre manipulações de strings no bash.

Em uma nota lateral, um sistema de controle de versão (como subversion, git, mercurial etc ...) tornaria esse tipo de diffing muito mais fácil.

    
por geirha 09.03.2012 / 15:38
46

diff -qr {DIR1} {DIR2} faz todos os arquivos em ambos os diretórios.

  • q mostra apenas diferenças
  • r é recursivo. Deixe de fora se você não precisa disso

Você não pode informar diff diretamente para usar curingas, mas pode adicionar:

-x PAT  --exclude=PAT
    Exclude files that match PAT.

-X FILE    --exclude-from=FILE
   Exclude files that match any pattern in FILE.

para excluir arquivos. Portanto, se você quiser apenas *.cpp , o método mais fácil é criar um arquivo de texto que contenha todos os arquivos que não são *.cpp .

    
por Rinzwind 09.03.2012 / 15:41
3

Algum tempo depois de fazer a pergunta, descobri o meld utilitário diff e estou usando-o desde então. Esta é uma grande parte do programa baseado em GUI que torna a comparação e a mesclagem entre arquivos e diretório uma tarefa muito fácil. Ele faz comparações de duas ou três direções.

Especificamente, ele responde à minha pergunta original, pois mostra uma comparação codificada por cores do conteúdo do diretório e permite que você compare arquivos específicos clicando duas vezes no nome do arquivo.

Se alguém precisar de mais do que uma comparação de três vias, então gvimdiff (com base no vim editor) também é ótimo e fornece essa funcionalidade.

    
por ysap 23.12.2012 / 06:09
1

Há uma solução leve para isso:

  1. Configure este minúsculo plug-in link
  2. Do diff dir1 dir2 | vim -R - no shell

Ele adicionará dobras e comparação lado a lado para arquivos alterados.

    
por Yuriy Ershov 14.01.2016 / 06:27

Tags