La commande uniq ne fonctionne pas correctement?


22

Je vérifie donc le md5hachage 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 33pour trouver les hachages uniques, j'obtiens ceci:

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

D'après ma compréhension, un seul des deux derpina.txtou derp.txtdevrait apparaître, car leurs hachages sont les mêmes. Suis-je en train de manquer quelque chose? Quelqu'un peut-il m'éclairer sur les raisons pour lesquelles il sort comme ça?


1
Deviner. Apparemment, uniq ne détecte pas les lignes répétées à moins qu'elles ne soient adjacentes. Lien vers la réponse qui m'a aidé stackoverflow.com/questions/23114677/…
user2127726

Réponses:


49

Vous devez utiliser sortavant uniq:

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

uniqsupprime uniquement les lignes répétées. Il ne réordonne pas les lignes à la recherche de répétitions. sortfait cette partie.

Ceci est documenté dans man uniq:

Remarque: 'uniq' ne détecte pas les lignes répétées à moins qu'elles ne soient adjacentes. Vous pouvez d'abord trier l'entrée ou utiliser sort -u' withoutuniq '.


uniqdevrait être alias comme sort -upar défaut dans tous les systèmes. Le cas échéant, il a toujours besoin de "trier" pour fonctionner correctement.
Devaroop

Ce changement atténuerait une certaine confusion. D'autre part, uniqa de nombreuses fonctionnalités non disponibles avec sort -u. Il y a aussi des cas où l'on veut utiliser uniqsans sort.
John1024

5

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 uniqsont limitées. Par exemple, il n'y a pas d'options pour spécifier de travailler sur certaines colonnes 3 et 5, en ignorant la colonne 4.

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

Pour l'exemple,

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

donne juste le même résultat, mais la sortpièce est plus flexible pour d'autres utilisations.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.