web-dev-qa-db-fra.com

La commande uniq ne fonctionne pas correctement?

Je vérifie donc le hash md5 de mes fichiers avec ceci comme sortie:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
657cf4512a77bf47c39a0482be8e41e0  ./dupes.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

Cependant, après avoir exécuté find . -type f -exec md5sum '{}' ';' | uniq -w 33 pour trouver les hachages uniques, je reçois ceci:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

D'après ce que j'ai compris, un seul des derpina.txt ou derp.txt devrait apparaître, car leurs hachages sont identiques. Est-ce que je manque quelque chose? Quelqu'un peut-il m'éclairer sur la raison pour laquelle il produit comme ça?

20
user2127726

Vous devez utiliser sort avant uniq:

find . -type f -exec md5sum {} ';' | sort | uniq -w 33

uniq supprime uniquement les lignes répétées. Il ne réorganise pas les lignes à la recherche de répétitions. sort fait cette partie.

Ceci est documenté dans man uniq:

Remarque: "uniq" ne détecte pas les lignes répétées, sauf si elles sont adjacentes. Vous voudrez peut-être trier d'abord l'entrée ou utiliser sort -u' withoutuniq '.

46
John1024

L'entrée pour uniqdoit être triée. Donc, pour l'exemple,

find . -type f -exec md5sum '{}' ';' | sort | uniq -w 33

travaillerait. Le -w (--check-chars=N) rend les lignes uniques uniquement en ce qui concerne la première colonne; Cette option fonctionne pour ce cas. mais les possibilités de spécifier les parties pertinentes de la ligne pour uniqsont limitées. Par exemple, il n’existe aucune option permettant de spécifier le travail sur certaines colonnes 3 et 5, en ignorant la colonne 4.

La commande sorta une option pour les lignes de sortie uniques, et les lignes sont uniques en ce qui concerne les clés utilisées pour le tri. Cela signifie que nous pouvons utiliser la puissante syntaxe de clé sortpour définir quelle partie les lignes doivent être uniq.

Pour l'exemple,

find . -type f -exec md5sum '{}' ';' | sort -k 1,1 -u

donne exactement le même résultat, mais la partie sortest plus flexible pour d’autres utilisations.

5
Volker Siegel

Ou vous pouvez installer killdupes, mon programme pour détruire tous les derniers doublons!

https://github.com/batchmcnulty/killdupes

:-)

0
Batch McNulty