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?
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' without
uniq '.
L'entrée pour uniq
doit ê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 uniq
sont 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 sort
a 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é sort
pour 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 sort
est plus flexible pour d’autres utilisations.
Ou vous pouvez installer killdupes, mon programme pour détruire tous les derniers doublons!
https://github.com/batchmcnulty/killdupes
:-)