Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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.
hmm


Fred
Ubuntu 22.04 LTS

Hors 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 !
lol


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 résolu, 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. smile
"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 smile


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é

sputnick a écrit :

Le truc, c'est que md5 est deprecated (collisions) depuis 2010 environ.

debian-facile a écrit :

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.

sputnick a écrit :

Ç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. smile

Dernière modification par Watael (Le 06/01/2023, à 13:24)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne