Faire: diff -r -X <ignore-list> <src-dir> <dest-dir>
ne semble pas faire diff
ignorer les entrées dans <ignore-list>
si elles ont la forme <dir>/<file>
.
Les entrées de la forme <file
> sont toutefois prises en compte. Ceci est un problème car je pourrais avoir plusieurs fichiers nommés <file>
dans différents sous-répertoires, dont certains ne doivent pas être ignorés.
Il semble qu'il n'y ait pas beaucoup d'informations concernant la syntaxe de motif dans la page de manuel pour diff
non plus. D'après ce que je peux dire, c'est simplement le nom de base d'un fichier qui est considéré par diff (voir http://forums.gentoo.org/viewtopic-t-889788-start-0 .html si vous êtes intéressé).
Répertorier les 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 des répertoires .svn
et .git
, mais également des fichiers individuels nommés *.Zip
/*.gz
/etc.
Éditez: Pour filtrer les chemins de la forme dir_a/file1
mais toujours diff
fichiers avec le même nom de base, tel que dir_b/file1
ou dir_a/b/file1
, puis une liste de fichiers à diff
devra être généré (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, en excluant par exemple */a/2.txt
mais en comparant d'autres fichiers nommés 2.txt
. Juste "trouver" tous les fichiers sauf ONE/a/2.txt
(une expression rationnelle peut également être utilisée ici, telle que .*/a/2.txt
)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
qui ignore en fait 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
Éditez: ou plus amusant avec find
(plaisir supplémentaire laissé comme exercice pour le lecteur), sélectionnez les fichiers ou les 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'd. (Au lieu du simple "-name b
", vous pouvez également utiliser "-regex '.*/b'
" - remarque, pas de fin "/".)
J'ai eu le même problème alors j'ai créé un correctif pour diff
. Le correctif n'a pas encore été accepté, mais vous pouvez créer votre propre version de diff
avec le correctif ou installer sur Arch Linux avec un package AUR .
Ici est le correctif diff
.
Pour exclure le répertoire directory/sub-directory
, j'utilise
diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory
Cependant, bien que cela devrait fonctionner pour une seule exclusion, il ne devrait pas être possible pour une longue liste ignorée comme vous l'avez fait.