32 votes

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> s'ils sont de la forme <dir>/<file> .

Entrées de la forme <file > sont toutefois pris en considération. C'est un problème car je je peux avoir plusieurs fichiers nommés <file> dans différents sous-répertoires, dont certains que je ne veux pas ignorer.

Il semble qu'il n'y ait pas beaucoup d'informations concernant la syntaxe des motifs en la page de manuel de diff soit. De ce que je peux dire, c'est juste 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é).

34voto

michael Points 1023

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

2voto

J'avais le même problème, j'ai donc créé un patch pour diff . Le patch n'a pas encore été accepté, mais vous pouvez construire votre propre version de diff avec le patch ou installer sur Arch Linux avec un paquet AUR .

Ici es el diff patch.

2voto

Pour exclure un répertoire directory/sub-directory J'utilise

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

Cependant, bien que cela doive fonctionner pour une seule exclusion, cela ne devrait pas être possible pour une longue liste d'exclusions comme celle que vous avez.

-2voto

klaar Points 101
$ diff -rq foo.orig foo | grep -vP 'ignore1/|exclude2/' | awk '{print $2}' | cut -d'/' -f2- | xargs -I{} diff -u foo.orig/{} foo/{}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X