Puis-je obtenir l'opposé de `diff -q` - faire correspondre des fichiers identiques sans imprimer leur contenu

13

J'ai un certain nombre de fichiers dans un répertoire et je veux vérifier qu'ils sont tous uniques. Pour simplifier, disons que j'ai trois fichiers: foo.txt, bar.txtet baz.txt. Si je lance cette boucle, je les vérifierai tous les uns contre les autres:

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

Pour les centaines de fichiers que je veux traiter, cela deviendrait assez illisible; il serait préférable de lister les fichiers qui font match et je peux regarder par- dessus la liste rapidement et assurez - vous que les fichiers ne sont eux - mêmes correspondent. À partir de la page de manuel, j'aurais pensé que l' -soption accomplirait ceci:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

... cependant, en fait, il imprime également tout le contenu des fichiers qui diffèrent. Existe-t-il un moyen de supprimer ce comportement, donc je ne reçois que le comportement ci-dessus?

Sinon, existe-t-il un autre outil qui peut accomplir cela ?

evilsoup
la source

Réponses:

6

Si vous souhaitez simplement vérifier si deux fichiers sont identiques ou non, utilisez cmp. Pour obtenir une sortie uniquement pour des fichiers identiques, vous pouvez utiliser

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff essaie de produire une liste courte et lisible par l'homme des différences, ce qui peut prendre beaucoup de temps, donc évitez les frais généraux si vous n'en avez pas besoin.

Uwe
la source
12

Cela devrait faire l'affaire:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

dir1et dir2sont vos deux répertoires.

Si vous souhaitez imprimer uniquement les répertoires correspondants à partir de dir1:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

Et de même, si vous souhaitez imprimer uniquement les répertoires correspondants à partir de dir2:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'
j0nam1el
la source
C'est exactement ce que je cherchais, merci!
Joshua Soileau
À utiliser diff -qrspour comparer des fichiers volumineux (silencieux supprime les différences d'impression)
marcovtwout
4

L' outil le plus rapide écrit à cet effet est fdupes (il est disponible dans les repos packages de Fedora et Ubuntu et…)

Usage:

fdupes -r dir1 dir2
erik
la source
2

Si vous avez besoin de trouver des fichiers identiques dans une liste, triez-les d'abord par taille, par exemple avec

ls -S

puis pour chaque groupe de fichiers de taille identique, exécutez- md5sumles pour voir facilement lesquels sont identiques à lesquels.

Pour les gros fichiers, il pourrait être plus rapide de commencer par une somme de contrôle uniquement une courte partie de l'ensemble du fichier:

dd if=file bs=512 count=1 | md5sum

puis effectuez une somme de contrôle complète uniquement sur les fichiers suspects.

enzotib
la source