Listado de directorios debería funcionar; por ejemplo, esto es lo que he usado en un script (suponiendo que gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... que ignora el contenido .svny los .gitdirectorios, pero también los archivos individuales llamados *.zip/ *.gz/ etc.
Editar: para filtrar las rutas del formulario dir_a/file1pero aún los diffarchivos con el mismo nombre base, como dir_b/file1o dir_a/b/file1, entonces diffse tendría que generar una lista de archivos (por ejemplo, usando find) y el archivo para comparar derivado de estas rutas; por ejemplo, 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
genera la lista de archivos para comparar, excluyendo, por ejemplo, */a/2.txtpero aún comparando otros archivos nombrados 2.txt. Simplemente "encuentre" todos los archivos excepto ONE/a/2.txt(una expresión regular también se puede usar aquí, como .*/a/2.txt)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
que en efecto ignora ONE/a/2.txt(y TWO/a/2.txt), pero aún compara los otros archivos llamados 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: O, más divertido con find(diversión adicional dejada como un ejercicio para el lector), seleccione los archivos o directorios para excluir y luego difftodo lo demás:
$ find ONE \( -regex 'ONE/a/2.txt' -o -name b -prune \) \
-o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \
El ejemplo anterior excluye el archivo específico "{top} /a/2.txt", cualquier directorio llamado "b", y todo lo demás está diferido. (En lugar de " -name b" también podría usar " -regex '.*/b'" - nota, sin seguimiento "/".)
diffla--excludeopción del hombre es una mierda ...