Fichiers diff présents dans deux répertoires différents


303

J'ai deux répertoires avec la même liste de fichiers. J'ai besoin de comparer tous les fichiers présents dans les deux répertoires à l'aide de la diffcommande. Existe-t-il une option de ligne de commande simple pour le faire, ou dois-je écrire un script shell pour obtenir la liste des fichiers, puis les parcourir?

Réponses:


422

Vous pouvez utiliser la diffcommande pour cela:

diff -bur folder1/ folder2/

Cela produira un diff récursif qui ignore les espaces, avec un contexte unifié:

  • le drapeau b signifie ignorer les espaces
  • drapeau u signifie un contexte unifié (3 lignes avant et après)
  • drapeau r signifie récursif

9
Vous pouvez avoir accès à la diffcommande en téléchargeant les utilitaires GNU pour Win32 .
Laurent Etiemble

7
J'ai également trouvé que l'option --brief est utile; vous obtenez une liste des fichiers modifiés et pouvez les traiter séparément
Dariusz

27
Pour d'autres qui se demandent, -bignore les changements d'espaces et -udonne 3 lignes de tampon.
rattray

28
Il est plus facile de se souvenir de cette commande si vous utilisez frotter au lieu de bur iediff -rub folder1/ folder2/
SomeGuyOnAComputer

11
J'imagine -burqu'il serait facile de se souvenir si vous viviez dans un climat froid.
AlanH

126

Si vous ne souhaitez voir que les fichiers qui diffèrent, vous pouvez utiliser:

diff -qr dir_one dir_two | sort

L'option "q" n'affichera que les fichiers qui diffèrent mais pas le contenu qui diffère, et "trier" organisera la sortie par ordre alphabétique.


1
C'est super! Fonctionne également efficacement - c'est-à-dire que si un sous-répertoire entier n'existe que dans l'un des répertoires, il cesse de s'y reproduire et ne signale que le sous-répertoire lui-même (sans son contenu successeur). très agréable!!
Quelque chose quelque chose du

C'est une très bonne première étape: voyez ce qui diffère, le cas échéant , puis faites une description détaillée diffde chaque paire de fichiers différents. Son approche serait extrêmement différente si un ou deux fichiers seulement différaient si des dizaines de fichiers différaient. Je pourrais me perdre dans la sortie diffen ingérant des dizaines de fichiers à la fois!
jvriesem

Peut également inclure -x PATTERNdans la commande pour exclure certains sous-répertoires. Par exemple, diff -qr repo1 repo2 -x ".git"comparera deux répertoires (repo1 et repo2) mais exclura les fichiers du dossier .git des répertoires respectifs.
ViFI

20

Diff a une option -rqui est censée faire exactement cela.

diff -r dir1 dir2


11

diffpeut non seulement comparer deux fichiers, il peut, en utilisant l' -roption, parcourir des arborescences de répertoires entières, en vérifiant récursivement les différences entre les sous-répertoires et les fichiers qui se produisent à des points comparables dans chaque arborescence.

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

3

S'il s'agit de diff GNU, vous devriez simplement pouvoir le pointer vers les deux répertoires et utiliser l'option -r.

Sinon, essayez d'utiliser

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

NB Comme l'a souligné Dennis dans la section commentaires, vous n'avez pas vraiment besoin de faire la substitution de commande sur le ls. Je fais cela depuis si longtemps que je le fais à peu près sur le pilote automatique et que je remplace la commande dont j'ai besoin pour obtenir ma liste de fichiers à comparer.

J'ai également oublié d'ajouter que je fais '\ ls' pour désactiver temporairement mon alias de ls vers GNU ls afin de perdre les informations de formatage des couleurs de la liste renvoyée par GNU ls.


2
Il n'est pas nécessaire d'utiliser ls:for i in ./dir1/*
pause jusqu'à nouvel ordre.

1
@Dennis, raccourci funky. +1. Je suis tellement habitué à faire de la substitution de commandes bien que ce soit automatique et j'utilise juste la commande dont j'ai besoin, par exemple j'utilise parfois find. L'utilisation de ls me permet également de jouer avec la liste dir plus, par exemple en fonction du temps inverse au lieu de la séquence par défaut.
Rob Wells

0

Voici un script pour montrer les différences entre les fichiers dans deux dossiers. Cela fonctionne récursivement. Modifiez dir1 et dir2.

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )

0

Si vous ne souhaitez pas spécifiquement comparer le contenu des fichiers et ne vérifier que celui qui n'est pas présent dans les deux répertoires, vous pouvez comparer les listes de fichiers, générées par une autre commande.

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'indique findde ne pas préfixer les chemins de sortie avec le répertoire racine.

J'ai également ajouté sortpour m'assurer que l'ordre des fichiers sera le même dans les deux appels de find.

À grepla fin, les informations sur les lignes d'entrée identiques sont supprimées.


-4

Essaye ça:

diff -rq /path/to/folder1 /path/to/folder2      

2
Cela duplique une réponse existante et n'ajoute aucun nouveau contenu. Veuillez ne pas poster de réponse à moins que vous ayez réellement quelque chose de nouveau à apporter.
Toby Speight
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.