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 .svn
et .git
dirs, mais aussi les fichiers individuels nommés *.zip
/ *.gz
/ etc.
Modifier: Afin de filtrer les chemins du formulaire dir_a/file1
mais toujours des diff
fichiers avec le même nom de base, tels que dir_b/file1
ou dir_a/b/file1
, alors une liste de fichiers à diff
gé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.txt
mais 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 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érent. (Au lieu du simple " -name b
", vous pouvez également utiliser " -regex '.*/b'
" - note, pas de "/" à la fin.)
diff
l'--exclude
option est tellement merdique ...