Quel est le moyen le plus simple et le plus simple de comparer deux structures de répertoires sans comparer réellement les données contenues dans des fichiers? Cela fonctionne bien:
diff -qr dir1 dir2_
Mais c'est vraiment lent parce que c'est aussi comparer des fichiers. Existe-t-il un commutateur pour diff ou un autre outil simple cli pour le faire?
linux
comparison
Jonas
la source
la source
-type d
option de la réponse de @ slartibartfast ou consulter ma réponse.Réponses:
Ce qui suit (si vous substituez le premier répertoire pour directory1 et le second pour directory2) devrait faire ce que vous cherchez et rapidement:
Le principe fondamental est qu'il imprime tous les répertoires, y compris les chemins de sous-répertoires, par rapport aux répertoires de baseN.
Cela pourrait tomber (produire une sortie bizarre) si vous aviez des retours à la ligne dans certains noms de répertoires mais pas dans d’autres.
la source
diff -rq
qu'il indique simplement que le répertoire racine existe en un et continue.vous donnera un bon affichage côte à côte des deux hiérarchies de répertoires avec toutes les sections communes repliées.
la source
J'utilise habituellement
rsync
pour cette tâche:SOYEZ TRÈS ATTENTION à toujours utiliser l’option
-n
, autrement dit--dry-run
, sinon cela synchronisera (changera le contenu des) répertoires.Cela permettra de comparer les fichiers en fonction de la taille et du temps de modification des fichiers ... Je pense que c'est ce que vous voulez vraiment, ou du moins que cela ne vous dérange pas. J'ai l'impression que vous voulez simplement que cela se produise plus rapidement , sans que vous ayez besoin d'ignorer la différence entre le contenu du fichier. Si vous ne voulez pas que la liste des fichiers avec des noms identiques diffère, je pense que l’ajout de cette
--ignore-existing
option le fera.Sachez également que ne pas mettre un
/
à la fin de leDIR1
fera comparer le répertoireDIR1
au contenu deDIR2
.La sortie finit par être un peu verbeuse, mais elle vous indiquera quels fichiers / répertoires diffèrent. Les fichiers / répertoires présents dans
DIR2
et non dansDIR1
seront précédés du motdeleting
.Dans certaines situations, la réponse de @ slartibartfast peut être plus appropriée, bien que vous deviez supprimer l'
-type d
option permettant d'activer la liste des fichiers autres que des répertoires.rsync
sera plus rapide si vous avez un nombre significatif de fichiers / répertoires à comparer.la source
deleting...
texte, mais c’est probablement l’un des meilleurs moyens de comparer des fichiers tout en maintenant la vitesse. Les autres réponses ici sont plus rapides lorsqu'il n'est pas nécessaire de différencier les fichiers ... comme dans l'exemple d'OP, mais j'aime beaucoup celui-ci.sudo -u nobody rsync -nav --delete d1 d2
condition que les drapeaux pour 'autres' permettent la lecture.Semblable à la réponse de ls mais si vous installez l’ arbre, vous pouvez
la source
diff <( tree dir1 ) <( tree dir2 )
i
drapeau, qui n'imprime pas les lignes de l'arbre (tree -i dir1
, etc.). Si la structure du répertoire est différente à un endroit, les autres fichiers qui correspondent peuvent avoir plus ou moins de|
symboles dans la sortie de l'arborescence, et diff interceptera ces lignes même si les chemins d'accès aux fichiers sont identiques.Je cherchais simplement une solution à ce problème. La solution qui m'a le plus plu était:
Il vous donne 3 colonnes: 1 - fichiers uniquement dans DIR1, 2 - fichiers uniquement dans DIR2, 3 - fichiers uniquement dans DIR3. Pour plus de détails, consultez cet article de blog.
la source
DIR3
spécifié? Tout ce que je vois estDIR1
etDIR2
.DIR1
dans la colonne 1 , tous les fichiers que dansDIR2
dans la colonne 2 , et tous les fichiers partagés par les deux dans la colonne 3 . C'est en quelque sorte utile, mais savez-vous comment on pourrait supprimer la colonne 3 et ne laisser que les différences? J'ai beaucoup de fichiers à trier et la plupart sont identiques. Je n'ai pas besoin de voir ce qui est pareil.comm <(ls DIR1) <(ls DIR2)
cela ne fonctionnait pas de manière récursive. Pour cela j'ai utilisécomm <(ls -R1 DIR1) <(ls -R1 DIR2)
.ls -R
parcourt les répertoires de manière récursive etls -1
(notez qu'il s'agit d'un seul , pas d'un L )ls
n'imprime qu'un seul nom de fichier par ligne.comm -3
(voirman comm
).Ensuite, diff juste les deux listes.
la source
C'est la solution optimale
--brief switch indique uniquement si les fichiers diffèrent, pas les détails de la différence.
la source
-q
dans la question, qui est un alias pour--brief
. Cette réponse ne fournit aucune nouvelle information.But it's really slow because it's comparing files too.
utilisez "diff -qr" pour obtenir les différents fichiers, puis filtrez la comparaison de fichiers avec grep afin de n'obtenir que les noms de fichiers ne figurant que dans l'un des répertoires.
la source
Cela a fonctionné pour mon besoin spécifique de trouver des fichiers manquants dans les arbres censés correspondre.
la source
Je pense que seul rsync est utilisateur. Pourquoi?
diff est utile uniquement pour les structures conservant des fichiers et des répertoires. Diff ne donne pas les codes de sortie adéquats lorsque nous utilisons des liens symboliques. Dans cette situation, diff peut renvoyer 2 codes de sortie, même si src et dst sont identiques (heures, tailles, noms, horodatages, liens symboliques de pointage, etc.).
dir, le système de fichiers ne garantit pas le classement des fichiers, même si le contenu du répertoire sur src et dst est identique. Peut-être devriez-vous filtrer la sortie ls en la triant. Mais pure ls n'affiche que les noms de nœuds.
Peut-être qu'un script incluant diff, cmp, test -X pour les types de nœuds sera utile, mais souvenez-vous de la surcharge générée par de nombreux tests / cmp. Le script sera très lent.
Comme d'habitude, si vous voulez obtenir des informations simples "les répertoires sont / n'est pas identiques", vous devez utiliser rsync avec l'option -n (dry). Si vous voulez trouver ce qui est différent, utilisez la commande diff.
la source