Script "create-duplicate-list" - version 2

Il y a environ un an, la version initiale du script "create-duplicate-list" était ajoutée à mon dépôt GitLab. Ce script répond à un besoin assez simple : "comment lister les fichiers identiques dans une arborescence de fichiers ?".

L'approche utilisée pour résoudre ce problème était simpliste : pour chaque fichier présent, calculer la somme de contrôle MD5. Une fois tous les fichiers identifiés, lister ceux ayant une somme de contrôle identique. La décision de supprimer une des copies surnuméraire demeure celle de l'utilisateur, le script n'ayant aucune notion de contexte pour juger laquelle devant être éliminée.

Le problème de ce script est que face à de nombreux fichiers, son exécution est lente ; tous sont examinés, quand bien même leur caractéristiques les rendent uniques (à l'opposé, deux fichiers identiques portant des noms différents seront détectés).

Avec un peu de recul, il est assez évident de procéder à une optimisation : seuls les fichiers de taille identique doivent être considérés. Cette deuxième mouture commence donc par lister tous les fichiers avec leur taille. Puis en se basant sur les résultats, le calcul des sommes de contrôle ne sera faite que pour les doublons.

Le gain n'est pas forcément très significatif ; beaucoup de fichiers peuvent avoir des tailles similaires (quantités de photos prises par un même appareil ont une taille moyenne proche). Tout dépendra du type de données sur lesquelles vous travaillez.

Le travail pour cette nouvelle version à été intéressant à plus d'un titre ; ajouter une étape préliminaire semblait d'emblée très simple mais plusieurs options et paramètres en général ignorés étaient nécessaire pour utiliser les traditionnels find, uniq ou sed.

Oui, il est possible d'utiliser uniq pour ne traiter que certain champs sur une ligne, mais non, vous ne pouvez pas choisir quel est le caractère utilisé pour les séparer. Vous devez au préalable procéder à des substitutions, que vous annulerez juste après.

Oui, il est possible d'utiliser un autre caractère que slash pour une commande avec sed, cela est même nécessaire si la valeur que vous ajoutez est un nom de répertoire.

Comme toujours la lecture des pages de manuel, plus des recherches vous guidant vers différents coins du web sont des sources qui vous apporteront frustrations et surprises, mais qui au final vous permettent de créer des outils plus élaborés.

publié le 9 avril 2020