Rechercher les doublons d'un ou plusieurs fichiers

Il n'est pas rare d'avoir sur son disque dur le même fichier présent à plusieurs endroits.

Comme des photos, par exemple ou des programmes.

Que de place perdue pour pas grand chose.

Voici un petit script qui scrute le répertoire, passé en argument, à la recherche de fichiers en double (voir plus).

Comme dans la plupart de mes scripts, vous y retrouverez la fonction "preRequis" permettant de savoir si toutes les commandes utilisées dans le script sont biens installées sur le système et la commande logger permettant de journaliser l'exécution du script dans /var/log/syslog.

Téléchargé le script ici.

Le script s'utilise de cette manière :

$ ./rechercheDoublons.sh mon_repertoire

J'utilise la commande find avec l'option -type f qui permet de rechercher tous les fichiers réguliers dans le répertoire passé en argument.
Pour chaque fichier retourné par la commande find, la commande md5sum lit le fichier en mode binaire (avec l'option -b) et écrit l'empreinte md5 du fichier dans le fichier /tmp/filesMd5sum.
Pour finir, le contenu du fichier /tmp/filesMd5sum est trié avec la commande sort, et tous les fichiers ayant la même empreinte md5 (grâce aux commandes awk '{print $1}' | uniq -d) sont affichés à l'écran.

# cat rechercheDoublons.sh
#!/bin/bash

function preRequis {
        for arg in $@; do
                if ! which $arg >/dev/null; then
                        logger -t $0 La commande $arg n\'est pas installée
                        echo "La commande $arg n'est pas installée !!!"
                        echo "Fin du script."
                        exit 1
                fi
        done
}

logger -t $0 Exécution du script

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"

preRequis md5sum sort awk uniq grep cut find

if [ ! $# -eq 1 ]; then
        echo "Erreur !!!"
        echo "Utilisation : $0 répertoire"
        exit 1
fi

FILE="/tmp/filesMd5sum"
REP="$1"

if [ ! -d "$REP" ]; then
        echo "Erreur !!!"
        echo "$REP n'est pas un répertoire."
        exit 1
fi

rm -f "$FILE"

find "$REP" -type f -exec md5sum -b {} \; > "$FILE"

DOUBLON=0

for file in $(cat "$FILE" | sort | awk '{print $1}' | uniq -d); do
        DOUBLON=1
        echo "Empreinte MD5 identique : $file"
        grep $file "$FILE" | cut -d' ' -f2
done

if [ "$DOUBLON" -eq 0 ]; then echo "Aucun doublon trouvé"; fi

logger -t $0 Fin d\'exécution du script

exit 0

 

Commentaires

Super script, merci !
Utilisé avec succès sur des centaines de Go d'images ;-)
Encore bravo !

Merci beaucoup pour votre commentaire.

Bonjour,

Je suggère un changement qui a l'avantage de simplifier le code et surtout d'éviter les problèmes d'espace et de caractères spéciaux dans les chemins.
Je remplacerais ça :


rm -f "$FILE"

for file in $(find "$REP" -type f); do
md5sum -b "$file" >> "$FILE"
done

par


find "$REP" -type f -exec md5sum -b {} \; > "$FILE"

Et merci pour ce script !

...merci pour cette amélioration

Ajouter un commentaire

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.