Como posso fazer 'diff -X' ignorar caminhos específicos e não nomes de arquivos?

24

Fazendo: diff -r -X <ignore-list> <src-dir> <dest-dir>

parece não fazer diff ignorar entradas em <ignore-list> se elas estiverem no formato <dir>/<file> .

Entradas do formulário <file > no entanto, considere-se. Isso é um problema, já que eu pode ter vários arquivos chamados <file> em diferentes subdiretórios, algumas das quais não quero que sejam ignoradas.

Parece não haver muita informação sobre a sintaxe de padrões em a manpage para diff também. Pelo que posso dizer, é apenas o nome base de um arquivo que é considerado pelo diff (veja link se você estiver interessado).

    
por Ash 13.09.2013 / 05:33

4 respostas

25

Listar diretórios deve funcionar; por exemplo, aqui está o que eu usei em um script (assumindo o diff do gnu),

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

... que ignora o conteúdo de .svn e .git dirs, mas também arquivos individuais chamados *.zip / *.gz / etc.

Editar: para filtrar caminhos do formulário dir_a/file1 , mas ainda diff arquivos com o mesmo nome de base, como dir_b/file1 ou dir_a/b/file1 , uma lista de arquivos a serem diff teria que ser gerado (por exemplo, usando find ) e o arquivo a ser comparado derivado desses caminhos; por exemplo, dado

$ find ONE TWO -type f -print 
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt

você gera a lista de arquivos para comparar, excluindo, por exemplo, */a/2.txt , mas ainda comparando outros arquivos denominados 2.txt . Apenas "encontre" todos os arquivos, exceto ONE/a/2.txt (um regexp também pode ser usado aqui, como .*/a/2.txt )

$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
    -exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;  

que, de fato, ignora ONE/a/2.txt (e TWO/a/2.txt ), mas ainda compara os outros arquivos chamados 2.txt :

diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt

Editar: Ou, mais divertido com find (diversão adicional deixada como um exercício para o leitor), selecione os arquivos ou diretórios para excluir e, em seguida, diff todo o resto:

$ find ONE \( -regex 'ONE/a/2.txt' -o -name b  -prune \)  \
    -o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \

O exemplo acima exclui o arquivo específico "{top} /a/2.txt", qualquer diretório chamado "b", e todo o resto é diferenciado. (Em vez de simples " -name b " você também pode usar " -regex '.*/b' " - note, no trailing "/".)

    
por 13.09.2013 / 08:45
1

Eu tive o mesmo problema, então criei um patch para diff . O patch ainda não foi aceito, mas você pode criar sua própria versão de diff com o patch ou instalar no Arch Linux com um pacote AUR .

Aqui é o patch diff .

    
por 24.06.2016 / 22:05
0

Para excluir o diretório directory/sub-directory , eu uso

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

No entanto, embora deva funcionar para uma única exclusão, ela não deve ser possível para uma longa lista de ignorados como você.

    
por 13.06.2018 / 16:40
-2
$ diff -rq foo.orig foo | grep -vP 'ignore1/|exclude2/' | awk '{print $2}' | cut -d'/' -f2- | xargs -I{} diff -u foo.orig/{} foo/{}
    
por 28.06.2017 / 04:57

Tags