logo rss

Chercher et lister les fichiers dupliqués sous GNU/Linux

Tux logo

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 commande
  • find -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)
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

adresse mail de contact