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