La liste des répertoires devrait fonctionner; par exemple, voici ce que j'ai utilisé dans un script (en supposant que gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... qui ignore le contenu de .svnet .gitdirs, mais aussi les fichiers individuels nommés *.zip/ *.gz/ etc.
Modifier: Afin de filtrer les chemins du formulaire dir_a/file1mais toujours des difffichiers avec le même nom de base, tels que dir_b/file1ou dir_a/b/file1, alors une liste de fichiers à diffgénérer devrait être (par exemple, en utilisant find), et le fichier à comparer dérivé de ces chemins; par exemple, étant donné
$ 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, excluant par exemple */a/2.txtmais toujours en comparant les autres fichiers nommés 2.txt. Il suffit de "trouver" tous les fichiers sauf ONE/a/2.txt(une expression rationnelle peut également être utilisée ici, par exemple .*/a/2.txt)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
qui en effet 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
Modifier: Ou, plus amusant avec find(plaisir supplémentaire laissé comme exercice pour le lecteur), sélectionnez les fichiers ou répertoires à exclure , puis difftout 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érent. (Au lieu du simple " -name b", vous pouvez également utiliser " -regex '.*/b'" - note, pas de "/" à la fin.)
diffl'--excludeoption est tellement merdique ...