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
Guillaume (non vérifié)
mar, 14/01/2014 - 16:23
Permalien
Félicitations !
Super script, merci !
Utilisé avec succès sur des centaines de Go d'images ;-)
Encore bravo !
ronan
mar, 14/01/2014 - 21:57
Permalien
Merci !!!
Merci beaucoup pour votre commentaire.
Arnaud (non vérifié)
mer, 18/09/2019 - 08:34
Permalien
Suggestion
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 !
ronan
jeu, 19/09/2019 - 21:05
Permalien
Effectivement...
...merci pour cette amélioration
Ajouter un commentaire