web-dev-qa-db-fra.com

Comment puis-je faire en sorte que 'diff -X' ignore les chemins spécifiques et non les noms de fichiers?

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é).

28
Ash

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 "/".)

29
michael

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.

2
Dave Parrish

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.

1