Os diretórios de listagem devem funcionar; por exemplo, aqui está o que eu usei em um script (assumindo o gnu diff),
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 diff
a ser gerada (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 nomeados 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 na verdade 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 find
(diversão adicional deixada como exercício para o leitor), selecione os arquivos ou diretórios a serem excluídos e depois 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 é diferente. (Em vez de simples " -name b
", você também pode usar " -regex '.*/b'
" - observe, não há "/" à direita).
diff
's--exclude
opção é tão merda ...