La lista 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 de .svn
y .git
dirs, pero también archivos individuales llamados *.zip
/*.gz
/etc.
Editar: Para filtrar rutas de la forma dir_a/file1
pero todavía diff
archivos con el mismo nombre base, como dir_b/file1
o dir_a/b/file1
, luego una lista de archivos a diff
tendría que generarse (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
generas la lista de archivos a comparar, excluyendo por ejemplo */a/2.txt
pero aún comparando otros archivos llamados 2.txt
. Simplemente "busque" todos los archivos excepto ONE/a/2.txt
(Aquí también se puede usar una expresión regular, 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
(se deja diversión adicional como 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á diferenciado. (En lugar de simple "-name b
" también podría usar "-regex '.*/b'
" - nota, sin final "/".)
Tuve el mismo problema, así que creé un parche para diff
. El parche aún no se ha aceptado, pero puede crear su propia versión de diff
con el parche o instálelo en Arch Linux con un paquete AUR.
Aquí está el diff
parche.
Para excluir el directorio directory/sub-directory
, yo uso
diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory
Sin embargo, aunque debería funcionar para una sola exclusión, no debería ser posible para una larga lista de ignorados como la que tiene.