61 votes

Linux : Comparer la structure des répertoires sans comparer les fichiers

Quelle est la meilleure et la plus simple façon de comparer deux structures de répertoires sans comparer les données dans les fichiers ? Cela fonctionne bien :

diff -qr dir1 dir2_

Mais c'est vraiment lent parce qu'il faut aussi comparer les fichiers. Existe-t-il un commutateur pour diff ou un autre outil cli simple pour faire cela ?

41voto

Slartibartfast Points 7645

Ce qui suit (si vous remplacez le premier répertoire par le répertoire 1 et le second par le répertoire 2) devrait faire ce que vous cherchez et rapidement :

find directory1 -type d -printf "%P\n" | sort > file1
find directory2 -type d -printf "%P\n" | sort | diff - file1

Le principe fondamental est qu'il imprime tous les répertoires, y compris les chemins des sous-répertoires par rapport au répertoire de baseN répertoires.

Cela pourrait échouer (produire des résultats bizarres) si vous avez des retours de chariot dans certains noms de répertoire mais pas dans d'autres.

35voto

Unnati Gutpa Points 11
vimdiff <(cd dir1; find . | sort) <(cd dir2; find . | sort)

vous donnera un bel affichage côte à côte des deux hiérarchies de répertoires avec les sections communes repliées.

24voto

Rena Points 107

J'utilise habituellement rsync pour cette tâche :

rsync -nav --delete DIR1/ DIR2

SOYEZ TRÈS PRUDENT pour toujours utiliser le -n , alias --dry-run ou il synchronisera (modifiera le contenu) les répertoires.

Cela permettra de comparer les fichiers en fonction des temps de modification et des tailles des fichiers... I pensez à c'est ce que tu veux vraiment, ou du moins ça ne te dérange pas si ça fait ça ? J'ai l'impression que tu veux juste que ça arrive. plus rapide Il n'est pas nécessaire qu'il ignore la différence entre les contenus des fichiers. Si vous voulez qu'il ne liste pas des fichiers différents avec des noms identiques, je pense que l'ajout de la balise --ignore-existing le fera.

Sachez également que le fait de ne pas mettre un / à la fin de DIR1 l'amènera à comparer le répertoire DIR1 avec le contenu de DIR2 .

La sortie est un peu verbeuse, mais elle vous montrera quels fichiers/répertoires diffèrent. Les fichiers/répertoires présents dans DIR2 et non dans DIR1 sera précédé du mot deleting .

Dans certaines situations, la réponse de @slartibartfast peut être plus appropriée, bien que vous deviez supprimer l'élément -type d pour activer la liste des fichiers non répertoriés. rsync sera plus rapide si vous avez un nombre important de fichiers/répertoires à comparer.

22voto

digit Points 221

Similaire à la réponse de ls mais si vous installez arbre alors vous pouvez

tree dir1 > out1
tree dir2 > out2
diff out1 out2

3voto

Je cherchais justement une solution à ce problème. La solution qui m'a le plus plu est la suivante :

comm <(ls DIR1) <(ls DIR2)

Il vous donne 3 colonnes : 1 - fichiers seulement dans DIR1, 2 - fichiers seulement dans DIR2, 3 - fichiers seulement dans DIR3 Pour plus de détails, regardez ceci blog post.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X