Comment trouver les doublons dans un gros répertoire ?

Posted by

Que ce soit de la musique, des dossiers, des images, il est parfois utile de partir à la recherche des doublons sur vos gros disques de stockage, afin de les trier et les éliminer.

Pour cela, on va utiliser un algorithme d’empreinte digitale sur chaque fichier et chercher les empreintes qui apparaissent de multiples fois.

Avec l’algorithme MD5 l’empreinte de n’importe quel fichier a toujours la même longueur de 32 caractères hexadécimaux ce qui nous suffit amplement pour cette application : 3 x 1038 combinaisons possibles (à comparer au Lotto 3 x 109 combinaisons).

Le nom des fichiers et leur date ne sont pas pris en compte pour la comparaison.

Mise en oeuvre, en utilisant Cygwin sous Windows.

1) Générer un fichier texte contenant toutes les empreintes MD5

cd /cygdrive/d/photos
find . -type f -iname "*.jpg" -exec md5sum {} \; >> ../photos.md5.txt

Le fichier va contenir des milliers de lignes semblables à celles-ci:

ffec08582acee50e888c0eb8ef0f66c2 *./g/piscine 16-02/111_1107.JPG
058985e2dcedb7a6692f3fbbecf86a91 *./g/piscine 16-02/111_1108.JPG
ed166e0b101812f8902086f4a3d1d354 *./g/piscine 16-02/111_1109.JPG
87ea7756e7dd8dbd2bd443cf179943f7 *./g/piscine 16-02/111_1110.JPG
3e2ed3ec9267119cfd234d907faff1f4 *./g/piscine 16-02/111_1111.JPG
b092ccabea875fb24725b25addb9eb5f *./g/piscine 16-02/111_1114.JPG
cb21d2e1daa65b7bb7b96d35741edb2c *./g/piscine 16-02/111_1116.JPG
41cedebb2579eb820f4545cd864c23be *./g/piscine 16-02/111_1119.JPG
3e2ed3ec9267119cfd234d907faff1f4 *./g/piscine 16-02/double_111_1111.JPG

2) La commande suivante va révéler tous les fichiers qui sont en double ou en multiples copies.

sort ../photos.md5.txt|uniq -w 32 -D|sort -k1.33|less

résultat:

3e2ed3ec9267119cfd234d907faff1f4 *./g/piscine 16-02/111_1111.JPG
3e2ed3ec9267119cfd234d907faff1f4 *./g/piscine 16-02/double_111_1111.JPG

Vous pouvez effacer toutes les copies sauf une, et ça c’est votre travail.

Explication sur les commandes utilisées:

find : trouve les fichiers correspondant au critère demandé ; le paramètre -exec ordonne d’exécuter la commande md5sum sur la liste de fichiers retournés par find.

md5sum : calcule l’empreinte md5 sur chacun des fichiers dont les noms sont passés en paramètre et l’affiche sur stdout.

sort : trie un fichier vers stdout. Aucun paramètre n’est passé donc le tri commence sur la 1è position de chaque ligne. Le fichier sera donc trié par empreinte md5.

uniq : identifie les lignes qui sont uniques ou celles qui ne le sont pas ; le paramètre -w 32 ordonne de ne prendre en compte que les 32 premières positions, c’est-à-dire l’empreinte md5. Le paramètre -D ordonne d’afficher toutes les lignes pour lesquelles le critère n’est pas unique.

sort : avec le paramètre -k1.33 ordre de trier à partir de la 33è position, donc par nom de fichier.

less : permet de naviguer dans les résultats. On pourrait aussi l’orienter vers un fichier avec > fichier.txt

Si on doit lire ce fichier sous Windows, il convient d’utiliser un autre programme que Notepad.exe (bloc-notes), par exemple Wordpad. Sinon les fins de lignes ne sont pas respectées et c’est illisible.