J'ai deux répertoires qui devraient contenir les mêmes fichiers et avoir la même structure de répertoires.
Je pense qu'il manque quelque chose dans l'un de ces répertoires.
À l'aide du shell bash, existe-t-il un moyen de comparer mes répertoires et de voir si l'un d'entre eux manque des fichiers présents dans l'autre?
command-line
AndreaNobili
la source
la source
bash --version
?Réponses:
Un bon moyen de faire cette comparaison est d'utiliser
find
avecmd5sum
, alors adiff
.Exemple
Utilisez find pour répertorier tous les fichiers du répertoire, puis calculez le hachage md5 pour chaque fichier et dirigez-le trié par nom de fichier vers un fichier:
Effectuez la même procédure dans un autre répertoire:
Comparez ensuite le résultat avec deux fichiers
diff
:Ou en tant que commande unique utilisant la substitution de processus:
Si vous voulez voir uniquement les modifications:
La commande cut n'imprime que le hachage (premier champ) à comparer par diff. Dans le cas contraire, diff imprimera chaque ligne car les chemins de répertoire diffèrent même lorsque le hachage est identique.
Mais vous ne saurez pas quel fichier a changé ...
Pour cela, vous pouvez essayer quelque chose comme
Cette stratégie est très utile lorsque les deux répertoires à comparer ne se trouvent pas sur le même ordinateur et que vous devez vous assurer que les fichiers sont égaux dans les deux répertoires.
Un autre bon moyen de faire le travail est d'utiliser la
diff
commande de Git (peut causer des problèmes lorsque les fichiers ont des autorisations différentes -> chaque fichier est alors répertorié dans la sortie):la source
find
les fichiers seront listés sera généralement différent entre les deux répertoires.Vous pouvez utiliser la
diff
commande comme vous le feriez pour des fichiers:Si vous souhaitez également voir les sous-dossiers et les fichiers, vous pouvez utiliser l'
-r
option suivante:la source
diff
fonctionne également pour les répertoires (man diff a confirmé cela), mais cela ne vérifie pas de manière récursive les modifications apportées aux sous-répertoires dans les sous-répertoires.a/b/c/d/a
,x/b/c/d/b
. Voyez ce quediff a x
vous donne.-r
option. Cela (diff -r a x
) me donne:Only in a/b/c/d: a. only in x/b/c/d: b.
Grâce à vous n'utilisez pas bash, vous pouvez le faire en utilisant diff avec
--brief
et--recursive
:Le
man diff
comprend les deux options:la source
Voici une alternative, pour comparer uniquement les noms de fichiers, et non leur contenu:
C'est un moyen facile de lister les fichiers manquants, mais bien sûr, il ne détectera pas les fichiers portant le même nom mais un contenu différent!
(Personnellement, j'utilise mon propre
diffdirs
script, mais cela fait partie d'une plus grande bibliothèque .)la source
diff
ne prend pas en charge pour le moment. Mais il y en acomm
qui le soutiennent depuis git.savannah.gnu.org/cgit/coreutils.git/commit/… donc une fois que cela arrive à un coreutils près de chez vous, vous pouvez le fairecomm -z <(cd folder1 && find -print0 | sort) <(cd folder2 && find -print0 | sort -z)
(dont vous pourriez avoir à convertir le format au format vous devez utiliser le--output-delimiter
paramètre et les outils supplémentaires).Peut-être qu'une option consiste à exécuter rsync deux fois:
Avec la ligne précédente, vous obtiendrez des fichiers qui sont dans dir1 et qui sont différents (ou manquants) dans dir2.
Même chose pour dir2
Vous pouvez supprimer l'
-n
option permettant de subir les modifications. C'est copier la liste des fichiers dans le deuxième dossier.Dans ce cas, une bonne option est peut-être d'utiliser
-u
, pour éviter d'écraser les fichiers les plus récents.Un one-liner:
la source
Si vous voulez rendre chaque fichier extensible et pliable, vous pouvez diriger la sortie de
diff -r
dans Vim.D'abord, donnons à Vim une règle de pliage:
Maintenant juste:
Vous pouvez frapper
zo
etzc
pour ouvrir et fermer les plis. Pour sortir de Vim, appuyez sur:q<Enter>
la source
Tâche assez facile à réaliser en python:
Remplacez les valeurs réelles par
DIR1
etDIR2
.Voici un exemple de parcours:
Pour la lisibilité, voici un script réel au lieu de one-liner:
la source
os.listdir
ne donne aucun ordre spécifique. Les listes peuvent donc avoir les mêmes choses dans un ordre différent et la comparaison échouera.Inspiré par la réponse de Sergiy, j'ai écrit mon propre script Python pour comparer deux répertoires.
Contrairement à beaucoup d'autres solutions, il ne compare pas le contenu des fichiers. De plus, il n’entre pas dans les sous-répertoires qui manquent dans l’un des répertoires. La sortie est donc assez concise et le script fonctionne rapidement avec les grands répertoires.
Si vous enregistrez dans un fichier nommé
compare_dirs.py
, vous pouvez l'exécuter avec Python3.x:Exemple de sortie:
PS Si vous avez besoin de comparer la taille des fichiers et les hachages de fichiers pour les modifications éventuelles, j’ai publié un script mis à jour ici: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
la source
cmpdirs dir1 dir2 '/\.git/'
J'ajouterai à cette liste une alternative à NodeJs que j'ai écrite il y a quelque temps.
dir-compare
la source
Je voudrais suggérer un excellent outil que je viens de découvrir: MELD .
Cela fonctionne correctement et tout ce que vous pouvez faire avec la commande
diff
sur un système basé sur Linux peut être reproduit avec une belle interface graphique! Prendre plaisirla source