#1 Le 07/05/2020, à 07:42
- philoeil
[RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Bonjour,
La problématique :
Je dois trier des fichiers doublons qui portent parfois un nom identique et qui ne sont pas identiques par leur md5sum.
Ces fichiers sont sur un disque source et sur des disques cibles des sauvegardes
Actuellement (etape 1 à 4 réalisées, étape 5 et 6 en cours)
1) Je recherche des doublons sur un emplacement source
2) J’en retire un fichier résultat1 qui donne la liste des noms de fichiers et leur Md5sum.
3) Etape importante : J’en sélectionne et supprime les lignes des originaux que je ne veux pas supprimer. j’en obtiens un fichier resultat2
(Je supprime les doublons sur la source)
4) Je recherche sur chaque disque cible à partir du fichier résultat2 pour chacune de ses lignes les doublons. J’en obtient un fichier resultat3
Le fichier resultat3 rassemble des disques cibles (les noms des fichiers, l’inode et les Md5sum) des nomFichiers identiques à resultat2
5) Je fais un contrôle pour éliminer les lignes de ce fichier resultat3 pour ne garder que les lignes à Md5sum identiques aux nomfichiers de la liste resultat2 j’en obtiens un fichier resultat4
6)Je supprime pour chaque ligne de Resultat4 les fichiers sur les disques cibles (par leur inode)
Pourrait-on regrouper les étapes 4 5 (voire 6) en 1 seule commande
quel complément peut-on imaginer à ma commande qui crée le resultat3 pour le faire ?
find $CheminCibleSav "$anciennom" -type f -printf "%h*%f*%i*%s* %c* dernier accès le %AA %Ad %AB %AY à %AH:%AM:%AS* " -exec /usr/bin/md5sum -b {} \;| sort -n -t "*" -k 6| awk -F"*" '{ TMo=$3/1048576; printf $1" § "$2 " § " TMo " § " $4 " § " $5 " § " $6 "\n"; }' | tee -a "$CheminDossierJournal/CIBLE$FicResult$DateJ$HeureJ"
Merci pour votre participation
Dernière modification par philoeil (Le 08/05/2020, à 15:58)
Hors ligne
#2 Le 07/05/2020, à 08:58
- Watael
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
je donne mon interprétation inachevée en trois partie pour une meilleure lisibilité, mais ce n'est qu'un seul script :
#!/bin/bash
rmPath()
{
echo "${1##*/}"
}
compareMD5()
{
read md5 nom <(md5sum "$2")
test "${md5Doublons["$1"]}" = "$md5" && md5Doublons=( ["$nom"]="$md5")
}
isIn_nomFichiers()
{
local file=$(rmPath "$1")
for f in "${Files[@]}"
do
test "$file" = "$f" && compareMD5 "$f" "$1"
done
}
isIn_2keep()
{
for f in "${toKeep[@]}"
do
test "$1" = "$f" && return 1
done
}
Cibles=( pointMontage1 pointMontage2 ... )
toKeep=( fichiers à ne pas traiter )
declare -A md5Doublons
srcDir="/chemin/repertoire"
shopt -s nullglob globstar
for file in "$srcDir"/**/*
do
if test -f "$file"
then
isIn_2Keep "$file" || isIn_nomFichiers "$file" || nomFichiers+=( "$(rmPath "$file")" )
fi
done
#ou, peut-être plus rapide
#find "$srcDir" -type f -print0 \
# | while IFS='' read -d '' file
# do
# isInFiles "$file" || Files+=( "$file" )
# done
for cible in "${Cibles[@]}"/**/*
do
for doublon in "${!md5Doublons[@]}"
do
if test "$cible" = "$doublon"
then
...
else
...
fi
done
done
pas de fichiers temporaires
les articulations sont clairement exposées
quand ça fonctionnera parfaitement, ALORS on cherchera à optimiser.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 07/05/2020, à 11:39
- philoeil
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Bonjour,
Merci Watael
Je prends merci
Hors ligne
#4 Le 07/05/2020, à 16:30
- philoeil
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Merci Watael
J'essaie depuis tout à l'heure de mettre en œuvre tes infos sans succès
Sans aide je n'y arrive pas
Peux-tu expliquer à quoi cela correspond
rmPath()
{
echo "${1##*/}"
}
Il va falloir beaucoup de patience si tu veux m'aider, peut-on faire pas à pas, étape par étape..
Je ne comprend pas comment recupérer les champs de mon fichier résultat3 avec tes commandes
pour les passer dans tes fonctions
Quelques lignes du fichier (test) resultat3 :
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible § F2_F07 Fichier avec espaces.mp3 § 6.53249 § 2040137 § d3fad710647642c327aceeec1b773a71
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.2 Espace Doublons § F2.2_F07 Fichier avec espaces.mp3 § 6.53249 § 2040146 § d3fad710647642c327aceeec1b773a71
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.2 Espace Doublons § FichierTxt3.txt § 1.62125e-05 § 2040147 § f6638c0e380e1a9a89b026c2f33600f9
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1_F07 Fichier avec espaces.mp3 § 6.53249 § 2040159 § d3fad710647642c327aceeec1b773a71
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § FichierTxt3.txt § 1.62125e-05 § 2040161 § f6638c0e380e1a9a89b026c2f33600f9
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.3DossierNormal § F2.3FichTexte1.txt § 0.00575733 § 2040149 § 0cbbff1c0f1c5bdc5ce8e2b8f483e560
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.3DossierNormal § FichierTxt3.txt § 1.62125e-05 § 2040150 § f6638c0e380e1a9a89b026c2f33600f9
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/REPORIAvecFichierPb § FOri2.1_F07 Fichier avec espaces.mp3 § 6.53249 § 2040140 § d3fad710647642c327aceeec1b773a71
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/REPORIAvecFichierPb § FORi2_Fichiertxt2.txt § 1.62125e-05 § 2040139 § aa0fe6e3a24fdbb81d9c78b03c20f152
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/REPORIAvecFichierPb § FOri2_FichierTxt3.txt § 1.62125e-05 § 2040138 § f6638c0e380e1a9a89b026c2f33600f9
Hors ligne
#5 Le 07/05/2020, à 16:45
- Watael
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
en fait, il n'y a plus de fichiers.
la première boucle (for file in "$srcDir"/**/*) crée une tableau de tous les fichiers qui ne sont pas à traiter (isIn_2keep, et qui ne sont pas des doublons.
isIn_2Keep "$file" || isIn_nomFichiers "$file" || nomFichiers+=( "$(rmPath "$file")" )
se lit comme :
$file est-il dans la liste des fichiers à ne pas traiter SINON $file est-il déjà dans la liste des fichiers (donc c'est un doublon)* SINON ajouter $file à la liste des fichiers uniques
la deuxième boucle parcourt les répertoires cibles, et compare la liste des doublons avec chaque fichier de leur fichier
--
* la fonction isIn_nomFichiers appelle la comparaison des md5sum pour assigner les fichiers à un autre tableau des doublons
Dernière modification par Watael (Le 07/05/2020, à 16:48)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 07/05/2020, à 16:57
- philoeil
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Bonjour,
Ok je comprend mieux, ton approche est tout autre.
J'ai besoin de ces fichiers intermédiaires résultats 1 à 3
je ne peux traiter en direct les données, il me faut du temps c'est pourquoi j'aimerai poursuivre mon projet, j'en suis à l'étape 5, les premières étapes décrite de 1 à 4 me conviennent et je ne souhaite pas les changer.
La difficulté principale que je rencontre est dans un traitement de 2 fichiers à comparer l'un l'autre étape 5 et 6. Et attention je dois pouvoir traiter le cas des fichiers à noms identiques différents dans leur contenu donc n'étant pas des doublons
Merci
Hors ligne
#7 Le 07/05/2020, à 17:05
- Watael
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
il faut être très précis sur ce que tu appelles des doublons, qui semblent couvrir deux notions différentes.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 07/05/2020, à 17:08
- philoeil
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Les doublons ne sont considérés doublons que si leur Md5sum est identiques, ils sont alors éliminés de la source puis des cibles (sauvegardes)
Merci
Hors ligne
#9 Le 07/05/2020, à 18:55
- Watael
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
donc,
d'abord (1), tu dresses la liste de tous les fichiers du répertoire source - liste qui comprend diverses informations, ainsi que leur somme md5.
ensuite (2), tu veux en supprimer les lignes qui correspondent à une autre liste (dans un fichier ?)
puis (3), tu veux chercher sur chaque cible les fichiers portant le nom des fichiers restants ?
je ne vais pas arriver à 6.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 07/05/2020, à 20:20
- philoeil
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Merci Watael
Voir #1 les 6 étapes j'en suis à la 5
Hors ligne
#11 Le 08/05/2020, à 00:29
- kamaris
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Ton fichier resultat2 doit contenir des colonnes, séparées par un séparateur "$sep", parmi lesquelles se trouve le md5sum, à une certaine position N.
Tu peux donc y avoir accès comme ça :
awk -F"$sep" '{print $N}' resultat2
Le md5sum est suffisamment particulier pour ne pas se casser la tête : tu peux directement faire un grep sur les lignes entières de resultat3 avec pour motif les md5sum de resultat2 (pas besoin de comparer précisément les md5sum de resultat2 et resultat3, ça reviendra au même).
Donc, pour éliminer les doublons dans resultat3, il te suffit de faire :
grep -f <(awk -F"$sep" '{print $N}' resultat2) resultat3
Cela correspond à ton étape 5.
Si tu veux la regrouper avec l'étape 4, il suffit de brancher le grep ci-dessus en sortie de l'étape 4.
Hors ligne
#12 Le 08/05/2020, à 02:58
- Watael
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
pour moi, 4 et 5 font la même chose :
4) Je recherche sur chaque disque cible à partir du fichier résultat2 [vers] un fichier resultat3
5) éliminer les lignes de ce fichier resultat3 pour ne garder que les lignes [...] de la liste resultat2
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 08/05/2020, à 07:05
- FrancisFDZ
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Bonjour,
Un détail me chiffonne : quand un doublon est repéré, il est bien entendu que un seul est conservé, non (et l'autre ou les autres supprimé(s)) ?
Le choix du fichier à conserver est-il laissé au programme ou tranché par l'utilisateur (donc en dehors du programme) ?
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#14 Le 08/05/2020, à 15:05
- philoeil
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Merci Watael, Kamaris, FrancisFDZ
Mes réponses :
Un détail me chiffonne : quand un doublon est repéré, il est bien entendu que un seul est conservé, non (et l'autre ou les autres supprimé(s)) ?
Le choix du fichier à conserver est-il laissé au programme ou tranché par l'utilisateur (donc en dehors du programme) ?
Les doublons sont éliminés et le choix est manuel par l’utilisateur en supprimant du fichier Resultat1 les originaux à conservant ce qui donne un fichier resultat 2 qui permet pas rm chemin des fichier listés dans resultat2 de supprimer toute la liste
J’utilise 1 seconde fois resultat2 pour chercher les fichier de noms à supprimer sur des cibles (qui sont d’anciennes sauvegardes, pour faire de la place) .
Les étapes 4 et 5 contrôlent si les fichiers identiques ne sont pas identiques de nom mais différents de md5sum.
Kamaris merci, c’est ce que je cherchais
grep -f <(awk -F"$sep" '{print $N}' resultat2) resultat3
J'essaie et vous dirai si c'est bon
Hors ligne
#15 Le 08/05/2020, à 15:58
- philoeil
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Bonjour,
Merci encore Kamaris, une fois encore tu m'a apporté une aide qi m'est très précieuse.
ça marche, c'est résolu!!!
CheminDossierJournal="/home/phil/ToutesSauvegardes/JournalSavTestSauvegarde"
# fichier resultat1 :
CheminActionsDoublons="/home/phil/ToutesSauvegardes/JournalSavTestSauvegarde/ActionDoublons.txt"
#Fichier resultat2 :exemple structure champs : Racine § F2.CpBBID2_EspaceApresNef.nef § 26.1399 § Wed May 6 15:41:10.7863311190 2020 § dernier accès le mercredi 06 mai 2020 à 15:41:35.5061463400 § 10a6ada757ec577d3a3db0654dd60a45
Resultat2="supprimer.txt"
#Fichier resultat3 (chemin/home/phil/ToutesSauvegardes/JournalSavTestSauvegarde/) exemple champs :/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible § F2_F07 Fichier avec espaces.mp3 § 6.53249 § 2040137 § d3fad710647642c327aceeec1b773a71 :
Resultat3="CIBLEResultCible.txt202005070900"
CheminCibleSav="/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde"
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
# --------------------------------------------- Etape Comparaisson des MD5 du fichier supprimer .txt avec le resultat des fichiers retrouvés dans disques cibles9 ---------------------------------------------------------
#-Resultat 3 Lancer une collecte des fichiers sur cible sauvegarde de même nom que les fichiers de la source "supprimer"
grep -f <(awk -F' § ' '{print $6}' $CheminDossierJournal/$Resultat2) $CheminDossierJournal/$Resultat3
Resultat
phil@phil-G750JH:~/Documents/JeCodeShell/TestAwkFind$ ./5_EtapeCompCible.sh
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Lancement ./5_EtapeCompCible.sh (Comparaison Cible Source .sh)
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible § F2.CpBBID2_EspaceApresNef.nef § 26.1399 § 2040136 § 10a6ada757ec577d3a3db0654dd60a45
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.2 Espace Doublons § F2.2 CpBBID2_EspaceApresNef.nef § 26.1399 § 2040148 § 10a6ada757ec577d3a3db0654dd60a45
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1 CpBBID2_EspaceApresNef.nef § 26.1399 § 2040160 § 10a6ada757ec577d3a3db0654dd60a45
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2foisDblons § F2.X2.2.1 CpBBID2_EspaceApresNef.nef § 26.1399 § 2040155 § 10a6ada757ec577d3a3db0654dd60a45
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2foisDblons § FOrig2.1 CpBBID2_EspaceApresNef.nef § 26.1399 § 2040153 § 10a6ada757ec577d3a3db0654dd60a45
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/REPORIAvecFichierPb § FOrig2.1 CpBBID2_EspaceApresNef.nef § 26.1399 § 2040141 § 10a6ada757ec577d3a3db0654dd60a45
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible § F2BBID1_1 espaceApresJpg.jpg § 13.1206 § 2040135 § 93243bbb48aa8de88968bee06e6c8c9b
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.2 Espace Doublons § F2.2BID1_1espaceApresJpg.jpg § 13.1206 § 2040144 § 93243bbb48aa8de88968bee06e6c8c9b
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1BBID1_1 espaceApresJpg.jpg § 13.1206 § 2040162 § 93243bbb48aa8de88968bee06e6c8c9b
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2foisDblons § F2.1X2_BBID1_1 espaceApresJpg.jpg § 13.1206 § 2040152 § 93243bbb48aa8de88968bee06e6c8c9b
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2foisDblons § FOri2.1BBID1_1 espaceApresJpg.jpg § 13.1206 § 2040154 § 93243bbb48aa8de88968bee06e6c8c9b
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/REPORIAvecFichierPb § FOri2.1BBID1_1 espaceApresJpg.jpg § 13.1206 § 2040142 § 93243bbb48aa8de88968bee06e6c8c9b
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible § F2.CpBBID2_EspaceApresNef.nef § 26.1399 § 2040136 § 10a6ada757ec577d3a3db0654dd60a45
/media/phil/SD7_SAM_3T_H/SAVTestSauvegarde/Racine2Cible/Rep2.2 Espace Doublons § F2.2 CpBBID2_EspaceApresNef.nef § 26.1399 § 2040148 § 10a6ada757ec577d3a3db0654dd60a45
Hors ligne
#16 Le 08/05/2020, à 21:03
- kamaris
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Attention aux chemins qui peuvent contenir des espaces : toujours mettre des guillemets :
grep -f <(awk -F' § ' '{print $6}' "$CheminDossierJournal/$Resultat2") "$CheminDossierJournal/$Resultat3"
Hors ligne
#17 Le 09/05/2020, à 07:07
- philoeil
Re : [RESOLU] Boucle de comparaison recherche peut-on etre plus performant
Bonjour,
Merci Kamaris,
ça va bien finir par rentrer...
, je corrige;)
Hors ligne