web-dev-qa-db-fra.com

Étant donné deux arborescences de répertoires, comment puis-je savoir quels fichiers diffèrent?

Si je veux trouver les différences entre deux arborescences de répertoires, je me contente généralement d'exécuter:

diff -r dir1/ dir2/

Cela affiche exactement les différences entre les fichiers correspondants. Je suis intéressé à obtenir juste une liste de fichiers correspondants dont le contenu diffère. J'ai supposé qu'il s'agirait simplement de passer une option de ligne de commande à diff, mais je n'ai rien trouvé dans la page de manuel.

Aucune suggestion?

717
Mansoor Siddiqui

Vous avez dit Linux, donc vous avez de la chance (au moins, il devrait être disponible, vous ne savez pas quand il a été ajouté):

diff --brief --recursive dir1/ dir2/ # GNU long options
diff -qr dir1/ dir2/ # common short options

Devrait faire ce dont vous avez besoin.

Si vous souhaitez également voir des différences pour les fichiers qui n'existent peut-être pas dans l'un des répertoires:

diff --brief --recursive --new-file dir1/ dir2/ # GNU long options
diff -qrN dir1/ dir2/ # common short options
1029
Mark Loeser

La commande que j'utilise est:

diff -qr dir1/ dir2/

C'est exactement la même chose que Mark's :) Mais sa réponse m'a dérangé car elle utilise différents types de drapeaux, et cela m'a fait regarder deux fois. En utilisant les drapeaux plus verbeux de Mark, ce serait:

diff  --brief --recursive dir1/ dir2/

Je m'excuse d'avoir posté lorsque l'autre réponse est parfaitement acceptable. Je ne pouvais pas m'empêcher de travailler pour être moins pédant.

280
FPC

J'aime utiliser git diff --no-index dir1/ dir2/, car il peut afficher les différences de couleur (si cette option est définie dans votre configuration git) et parce qu'il affiche toutes les différences dans une sortie paginée longue en utilisant "moins".

92
Alan Porter

Ces deux commandes font essentiellement la chose demandée:

diff --brief --recursive --no-dereference --new-file --no-ignore-file-name-case /dir1 /dir2 > dirdiff_1.txt

rsync --recursive --delete --links --checksum --verbose --dry-run /dir1/ /dir2/ > dirdiff_2.txt

Le choix entre eux dépend de l'emplacement de dir1 et dir2:

Lorsque les répertoires résident sur deux lecteurs distincts, diff surpasse Rsync. Mais lorsque les deux répertoires comparés se trouvent sur le même lecteur, rsync est plus rapide. C'est parce que diff place une charge presque égale sur les deux répertoires en parallèle, maximisant la charge sur les deux lecteurs.

rsync calcule les sommes de contrôle en gros morceaux avant de les comparer. Cela regroupe les opérations d'E/S en gros morceaux et conduit à un traitement plus efficace lorsque les choses se passent sur un seul disque.

31
CodeBug

Meld est également un excellent outil pour comparer deux répertoires:

meld dir1/ dir2/

La fusion a beaucoup d'options pour comparer des fichiers ou des répertoires. Si deux fichiers diffèrent, il est facile d'entrer dans le mode de comparaison de fichiers et de voir les différences exactes.

17
Alexander

'Billings' (de freenode/# centos fame), son compatriote de la chaîne, a partagé sa méthode avec moi:

diff -Naur dir1/ dir2

Inclure la barre oblique finale du répertoire n'a pas d'importance.

En outre, il apparaît que l'option -u n'est pas disponible sur certaines versions plus anciennes/server de diff.

La différence en diffs:

# diff -Nar /tmp/dir1 /tmp/dir2/
diff -Nar /tmp/dir1/file /tmp/dir2/file
28a29
> TEST

# diff -qr /tmp/dir1/ /tmp/dir2/
Files /tmp/dir1/file and /tmp/dir2/file differ
9
todd_dsm

Diffoscope est un excellent outil de comparaison de répertoires basé sur la ligne de commande.

J'aime particulièrement le fait qu'il puisse différencier en fichiers:

Il décompresse récursivement les archives de nombreux types et transforme divers formats binaires en un format plus lisible par l'homme pour les comparer. Il peut comparer deux archives, des images ISO ou PDF tout aussi facilement.

Cela vous indiquera non seulement quels fichiers diffèrent, mais également en quoi ils diffèrent.

3
nh2

Pour trouver diff utilisez cette commande:

diff -qr dir1/ dir2/

- r diffère également tous les sous-répertoires - q indique à diff de ne signaler que les différences entre les fichiers.

diff  --brief dir1/ dir2/

- brief montrera les fichiers qui existent dans le répertoire.

Ou sinon

nous pouvons utiliser Meld qui montrera dans une fenêtre graphique qu'il est facile de trouver la différence.

meld  dir1/ dir2/
2
Javeed Shakeel

Vous pouvez aussi utiliser Rsync et find. Pour find:

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

Mais les fichiers portant les mêmes noms et dans les mêmes sous-dossiers, mais avec un contenu différent, ne seront pas affichés dans les listes.

Si vous êtes un fan de GUI, vous pouvez vérifier Meld que @ Alexander mentionné. Cela fonctionne très bien dans Windows et Linux.

0
Fábio