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 .svn
y los .git
directorios, pero también los archivos individuales llamados *.zip
/ *.gz
/ etc.
Editar: para filtrar las rutas del formulario dir_a/file1
pero aún los diff
archivos con el mismo nombre base, como dir_b/file1
o dir_a/b/file1
, entonces diff
se 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.txt
pero 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 diff
todo 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 "/".)
diff
la--exclude
opción del hombre es una mierda ...