Chercher et lister les fichiers dupliqués sous GNU/Linux
- Mise à jour le 20 oct. 2024

Cela faisait longtemps que je cherchais un moyen de trouver les fichiers dupliqués (doublons) sur mon système Linux. J'ai trouvé une solution en ligne de commande sur ce site : http://tips4linux.com/. Je me suis permis de l'adapter à mes besoins et je vais en profiter pour disséquer la commande en détail. En résumer, la commande récupère la taille de tous les fichiers (ce qui est rapide), les compare si des tailles identiques sont trouvées un hash md5 est appliqué (ce qui est long) pour s'assurer qu'ils soient bien identiques.
Commande
On déclare la variable SEARCH qui contient le chemin du dossier dans lequel on souhaite chercher nos doublons :
root@host:~# SEARCH=/data
root@host:~# find $SEARCH -not -empty -type f -printf %s\\n | sort -rn | uniq -d | xargs -I{} -n1 find $SEARCH -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
Explications
find $SEARCH -not -empty -type f -printf %s\\n
-not
: équivalent à ! ou non-empty
: vide-type f
: chercher uniquement des fichiers-printf %s\\n
: affiche le résultat (taille du fichier) suivi d'un retour chariot
sort -rn
-rn
: affichage inversé et trie de façon numéraire
uniq -d
-d
: répété, n'affiche que les lignes dupliquées
xargs -I{} -n1 find $SEARCH -type f -size {}c -print0
xargs -I{} -n1
: remplace l'argument récupéré par {} et utilise au maximum un argument par ligne de commandefind -type f -size {}c -print0
: affiche les nom des fichiers dont la taille est de {} (récupéré par xargs)
xargs -0 md5sum
-0
: les éléments retournés termines par un caractère null au lieu d'un espace. Utile lorsque les éléments retournés peuvent contenir un espace, des guillemets ou antislash.
uniq -w32 -all-repeated=separate
-w
: ne pas comparer plus de 32 caractères (pour ne comparer que le hash)-all-repeated=separate
: affiche tout les résultats identiques de façons groupés (séparés par une ligne vide)