web-dev-qa-db-fra.com

Les fichiers diff présents dans deux répertoires différents

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

267
Sudar

Vous pouvez utiliser la commande diff pour cela:

diff -bur folder1/ folder2/

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

  • b flag signifie ignorer les espaces
  • indicateur signifie un contexte unifié (3 lignes avant et après)
  • r drapeau signifie récursif
383
Laurent Etiemble

Si vous êtes uniquement intéressé à voir les fichiers qui diffèrent, vous pouvez utiliser:

diff -qr dir_one dir_two | sort

L'option "q" affiche uniquement les fichiers qui diffèrent, mais pas le contenu qui diffère, et "trier" organise la sortie par ordre alphabétique.

105
Suresh

Diff a une option -r qui est censée le faire.

diff -r dir1 dir2

18
CodeRain

diff ne peut pas uniquement comparer deux fichiers, il peut également, en utilisant l'option -r, parcourir des arborescences de répertoires entières, en vérifiant de manière récursive 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.

...
11
miku

Si c'est GNU diff, vous devriez juste 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

N.B. Comme l'a souligné Dennis dans la section des commentaires, vous n'avez pas réellement besoin de remplacer la commande par ls. Je fais cela depuis si longtemps que je le fais presque en pilote automatique, en substituant la commande dont j'ai besoin pour obtenir ma liste de fichiers à des fins de comparaison.

Aussi, j'ai oublié d'ajouter que je fais '\ ls' pour désactiver temporairement mon alias de ls sur GNU ls afin que je perde les informations de mise en forme des couleurs de la liste renvoyée par GNU ls.

3
Rob Wells

Voici un script pour montrer les différences entre les fichiers de deux dossiers. Cela fonctionne récursivement. Changer 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
Evgeny Karpov