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?
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é:
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.
Diff a une option -r
qui est censée le faire.
diff -r dir1 dir2
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.
...
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.
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" )