#1 Le 26/09/2022, à 10:31
- Watael
trouver les doublons (nom et/ou contenu) sous un répertoire donné
#!/bin/bash
# Objectif : trouver les doublons, que les fichiers portent le même nom, et/ou qu'ils aient le même contenu (sameName, sameHash, sameHashName)
# NB: il serait préférable, pour la présentation entre autres, d'utiliser des fichiers temporaires plutôt que des variables (tableaux indexés et associatifs)
# dans lesquels les noms des fichiers seront séparés par un caractère NULL : printf '%s\0' "$nomFichier" >>"/tmp/${same...[ref]}"
repertoire=$HOME/Images #à adapter à vos besoins.
#NE RIEN MODIFIER EN-DESSOUS
shopt -s globstar extglob nullglob
declare -A H N sameHash sameName
declare -i nbFic H N
for f in "$repertoire"/**
do
if test -f "$f"
then
nbFic+=1 #facultatif
read -r hash nom < <(md5sum "$f")
hashes+=( $hash )
noms+=( "$nom" )
H[$hash]+=1
N[${nom##*/}]+=1
fi
done
echo "$nbFic fichiers traités"
for h in "${!hashes[@]}"
do
(( ${H[${hashes[h]}]} >1 )) && \
sameHash[${hashes[h]}]="${sameHash[${hashes[h]}]:+"${sameHash[${hashes[h]}]} "}${noms[$h]}"
done
printf '\nsameHash : %d\n=============\n' ${#sameHash[*]}
for h in "${!sameHash[@]}"; do echo "$h : ${sameHash[$h]}"; done
for n in "${!noms[@]}"
do
nom=${noms[n]##*/}
(( ${N[$nom]} >1 )) && \
sameName[$nom]="${sameName[$nom]:+"${sameName[$nom]} "}${noms[n]}"
done
printf '\nsameName : %d\n=============\n' ${#sameName[*]}
for n in "${!sameName[@]}"; do echo "$n : ${sameName[$n]}"; done
printf '\nsameName ET sameHash\n=============\n'
for i in "${!sameName[@]}"
do
for y in "${sameHash[@]}"
do
[[ $y =~ $i ]] && { printf '%s sous : ' "$i"; find ~/Images/ -type f -name "${BASH_REMATCH[@]}" -printf '%h '; echo;}
done
done
Dernière modification par Watael (Le 26/09/2022, à 10:33)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#2 Le 01/10/2022, à 13:46
- fred-cavernedufond
Re : trouver les doublons (nom et/ou contenu) sous un répertoire donné
# Objectif : trouver les doublons, que les fichiers portent le même nom, et/ou qu'ils aient le même contenu (sameName, sameHash, sameHashName)
Krusader ? https://krusader.org/get-krusader/
...il manque une ligne de prog' :
# bonjour ; merci de votre aide ; à bientot.
Fred
Ubuntu 22.04 LTS
En ligne
#3 Le 01/10/2022, à 14:23
- erresse
Re : trouver les doublons (nom et/ou contenu) sous un répertoire donné
Bonjour Watael, Pourquoi ce script ? Est-ce que "fdupes" ne te satisfait pas pour traiter ce type d'opération ?
À moins que ton outil n'apporte une différence qui m'aura échappée...
Faut dire que tu n'as pas vraiment forcé sur la description ou le mode d'emploi du truc !
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#4 Le 01/10/2022, à 15:49
- Watael
Re : trouver les doublons (nom et/ou contenu) sous un répertoire donné
@fred-cavernedufond
Bonjour,
je n'ai pas besoin de votre aide, et je ne vous remercie donc pas.
"Trucs, astuces, et scripts utiles" n'est pas destiné à demander de l'aide, mais à proposer une aide.
@erresse
ça fait suite à cette discussion (j'ai en effet oublié de faire un renvoi) pour répondre au script de LeoMajor que je trouve compliqué pour un maigre résultat.
le script s'exécute, et remplit son objectif (remonter les noms des fichiers qui ont le même contenu, et/ou le même nom) .
Que dire de plus ?
Dernière modification par Watael (Le 01/10/2022, à 15:57)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 04/01/2023, à 22:29
- sputnick
Re : trouver les doublons (nom et/ou contenu) sous un répertoire donné
Le truc, c'est que md5 est deprecated (collisions) depuis 2010 environ. Ne pas se baser sur ça, mais plutôt sur sha*sum. CF https://en.wikipedia.org/wiki/MD5
Puis effectivement, fdupe est lent, mais il marche très bien et codé en C. Pour mes besoins perso, il m'a toujours rendu service. C'est fiable et éprouvé.
En tout cas, merci du partage, mais je ne conseille pas ton script (sorry).
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#6 Le 05/01/2023, à 23:03
- Watael
Re : trouver les doublons (nom et/ou contenu) sous un répertoire donné
cf. @erresse.
ce n'est pas une optimisation de l'existant* (que je n'ai pas lu), c'est une "démonstration", humble (si vous avez des arguments pour des optimisations...).
--
* donc, il existe mieux, plus fiable... et je vous encourage à l'utiliser.
encore une fois, il ne s'agit ici que d'une réponse à pire, et qui montre une possibilité en bash (shell, qui est sous-estimé/méprisé).
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 06/01/2023, à 01:29
- sputnick
Re : trouver les doublons (nom et/ou contenu) sous un répertoire donné
Ça s’appelle essayer de réinventer la roue
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#8 Le 06/01/2023, à 13:23
- Watael
Re : trouver les doublons (nom et/ou contenu) sous un répertoire donné
Le truc, c'est que md5 est deprecated (collisions) depuis 2010 environ.
fdupes est utilitaire en ligne de commande qui permet de retrouver très rapidement les fichiers en doublon[...], il ne se base pas sur le nom des fichiers mais les identifie en comparant la signature MD5 des fichiers suivie d'une comparaison octet à octet.
Ça s’appelle essayer de réinventer la roue
soit, mais tu persistes à omettre le contexte.
d'ailleurs, le script fait les deux : il cherche les fichiers qui ont le même nom, et/ou les fichiers qui ont la même somme de contrôle.
finalement, c'est un tricycle.
Dernière modification par Watael (Le 06/01/2023, à 13:24)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne