Lister les répertoires devrait fonctionner ; par exemple, voici ce que j'ai utilisé dans un script (en supposant gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
...qui ignore le contenu de .svn
y .git
mais aussi des fichiers individuels nommés *.zip
/ *.gz
/etc.
Edita: Afin de filtrer les chemins de la forme dir_a/file1
mais quand même diff
avec le même nom de base, tel que dir_b/file1
o dir_a/b/file1
puis une liste de fichiers à diff
devrait être généré (par exemple, en utilisant find
), et le fichier à comparer dérivé de ces chemins ; par exemple, étant donné que
$ 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
vous générez la liste des fichiers à comparer, en excluant par exemple */a/2.txt
mais en comparant toujours d'autres fichiers nommés 2.txt
. Il suffit de "trouver" tous les fichiers sauf ONE/a/2.txt
(un regexp peut également être utilisé ici, tel que .*/a/2.txt
)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
qui, en fait, ignore ONE/a/2.txt
(et TWO/a/2.txt
), mais compare toujours les autres fichiers nommés 2.txt
:
diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt
Edita: Ou, plus amusant avec find
(un plaisir supplémentaire laissé comme un exercice pour le lecteur), sélectionnez les fichiers ou les répertoires à exclure y luego diff
tout le reste :
$ find ONE \( -regex 'ONE/a/2.txt' -o -name b -prune \) \
-o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \
L'exemple ci-dessus exclut le fichier spécifique "{top}/a/2.txt", tout répertoire nommé "b", et tout le reste est diff'd. (Au lieu du simple " -name b
"vous pouvez également utiliser " -regex '.*/b'
(" - note, pas de "/" à la fin).