#26 Le 18/04/2021, à 05:56
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Bonjour,
Merci Kamaris et Watael
Ci-dessous le script test
(l'original fait 5700 lignes et j'en ai extrait les lignes pertinentes pour le test et je suis arrivé à localiser le code déclencheur du bug en seulement 421 lignes :lol)
J'ai placé les lignes concernées entre 2 :
# ==================TBF8 ==============================================================
Pour mieux localiser
# paramètre en local test
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
JeSuisIci="$PWD"
CheminActionDbl="."
NomBatch="NomBatch"
if [[ ! -d "./Journal$NomBatch" ]]
then
mkdir -v "./Journal$NomBatch"
fi
CheminJournal="./Journal$NomBatch""LisezMoiJournalSauvegarde"
CheminJournalErreur="./JournalErreur"
CheminJournalDeveloppeur="./JournalDeveloppeur"
REP_ADMir="$CheminActionDbl/ActionDoublons.txt"
LFD=$(egrep -v '^§+' "$REP_ADMir")
if [[ ! -d "./Journal$NomBatch/TmpParametres" ]]
then
mkdir -v "./Journal$NomBatch/TmpParametres"
fi
CheminParamTMP="./Journal$NomBatch/TmpParametres"
RegroupRLDD="$CheminParamTMP/RegroupRLDD"
if [[ ! -f "$RegroupRLDD" ]]
then
touch "$RegroupRLDD"
else
truncate -s 0 "$RegroupRLDD"
fi
function verbeux(){
# ----------------------- Choix du mode d'affichage verbeux=conception ou non=usage
echo "Execution dans le mode verbeux = Afficher les paramètres et tous les messages...";
Verbeux="True"
#shift
}
while :; do
case $1 in
-h|-\?|--help)
usage # Display a usage synopsis.
exit
;;
-v|--verbeux)
# echo "Liste des arguments =$@"
# echo "nombre de paramètres : $#"
verbeux $2;
shift # decale les arguments vers la gauche
break
;;
--verbeux)
verbeux $2;
shift # decale les arguments vers la gauche
break
;;
-) # End of all options.
shift
break
;;
-?*)
printf 'Avertissement : Option inconnue sortie %s\n' "$1" >&2
exit
;;
*) # Default case: No more options, so break out of the loop.
break
esac
shift
done
CPCMiroir()
{
CheminMiroirSupprimer="$1"
if [[ ! -f "$CheminMiroirSupprimer" ]]
then
touch "$CheminMiroirSupprimer"
else
truncate -s 0 "$CheminMiroirSupprimer"
fi
echo ""
#Pour chaque élément CPCent
# Du 1er au dernier fichier de ce répertoire
# Trouver les n doublons
# Pour chaque doublons lister les répertoires Miroirs potentiels
# identifier si un RepDoublonsMiroir a déjà été identifié identique sur les doublons précédents
# Ne conserver de la liste des RepDoublonsMiroir que ceux qui sont déjà relevé
# Pour identifier Vrai un rep miroir doublons il faut
# Que tous les fichiers de rep source ou de repMiroirdoublons soient contenu l'un dans l'autre
# Identifier qui est miroir avec qui
# -------------------------------------------------------------------------------------------
# set -x
# comparer les fichiers suivants de RLDD pour valider qu'ils sont tous présents dans D_CPC
RegroupRLDD="$CheminParamTMP/RegroupRLDD"
if [[ ! -f "$RegroupRLDD" ]]
then
touch "$RegroupRLDD"
else
truncate -s 0 "$RegroupRLDD"
fi
# DEBUT valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
D_CPC="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2"
NbrF_D_CPC=$(find "$D_CPC" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
# Recupération des lignes donnant la liste des md5sum de chaque répertoire CPCent
ListeUniq_D_CPC=$(grep "$D_CPC §" "$REP_ADMir") # " §" nécessaire pour limiter la recherche à D_CPC sans les sous chemins
# liste des md5sum :
truncate -s 0 "$CheminParamTMP/LMD5_D_CPC"
echo "\$ListeUniq_D_CPC :"
echo "$ListeUniq_D_CPC"
LMD5_D_CPC=$(echo "$ListeUniq_D_CPC" | awk -F " § " '{print $6}')
echo " la liste \$LMD5_D_CPC :
$LMD5_D_CPC"
echo "$LMD5_D_CPC" >"$CheminParamTMP/LMD5_D_CPC" # est utilisé plus bas pour éviter sous shell
unset RLDD
while IFS="\n" read MD5Fic # While MD5Fic
do # Parcours des MD5sum du dossier D_CPC # While MD5Fic
# recherche de la liste des dossiers contenant les doublons de D_CPC dont le contenu est à comparer à D_CPC
RLDD[index++]=$(echo "$LFD" | grep "$MD5Fic" | awk -F " § " '{print $1}'| sort | uniq)
done <"$CheminParamTMP/LMD5_D_CPC" # While MD5Fic
echo "${RLDD[0]}"
nb_elements="${#RLDD[*]}"
hauteur="${#RLDD[@]}"
echo "nombres d'éléments dans le tableau RLDD = $nb_elements"
echo "hauteur du tableau RLDD = $hauteur"
# Parcours des répertoires contenant des doublons du répertoire D_CPC
# Chaque fichier de D_CPC avait une MD5sum en doublons dans 1 ou plusieurs dossiers RLDD.
# Ce dossier miroir RLDD peut être identique ou différent des autres RLDD miroir d'autres fichiers doublons de D_CPC
# Une fois ces dossiers identifiés pour limiter le nombre d'opérations, 1 première tache de regrpoupement de ces dossier parfois identique permet de limiter la durée de traitement
# Puis il est identifié dans chaque rep RLDD si le nombre de fichier peut correspondre à un cas miroir
# selon le resultat de la comparaison du nombre de fichiers entre D_CPC et RLDD examiné il est vérifié si l'hypothèse miroir est valide ou non
for FicRLDD in "${RLDD[@]}" # For FicRLDD
do # For FicRLDD
ligne=$(($ligne+1))
echo "ligne=$ligne"
echo "FicRLDD : ${FicRLDD}"
done # For FicRLDD
# Debut modif pour supprimer les lignes redondantes
echo -e "\n Regroupement des recherches :"
truncate -s 0 "$RegroupRLDD"
for FicRLDD in "${RLDD[@]}" # For2 FicRLDD
do # For2 FicRLDD
echo "${FicRLDD}" | while IFS="\n" read LigneRLDD # While LigneRLDD
do # While LigneRLDD
ResultRegroup=$(grep -c "$LigneRLDD" "$RegroupRLDD")
if [ "$ResultRegroup" -eq 0 ]
then
if [ "$LigneRLDD" != "$D_CPC" ]
then
# ajoute la ligne dans $RegroupRLDD
echo "$LigneRLDD" >> "$RegroupRLDD"
else
echo " la ligne $LigneRLDD ne doit pas être ajoutée "
fi
else
echo " la ligne $LigneRLDD existe déjà "
fi
done # While LigneRLDD
done # For2 FicRLDD
echo " resultat du regroupement : "
cat "$RegroupRLDD"
# ==================TBF8 ==============================================================
exec 2>$tty # Suspend la redirection d'erreur
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
# Cette forme ne chage rien : exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
while IFS="\n" read D_RLDD # =colonne 1 parcours de la liste des dossier contenant les doublons
do # parcours de la liste des dossier contenant les doublons
# comparaison des fichiers de chaque dossier pour déterminer si miroir ou non de D_CPC
# ==================TBF8 FIn ==============================================================
# nombre de fichier du dossier D_RLDD
if [ "$D_RLDD" == "$D_CPC" ] # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
then # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
echo "Dossier en cours $D_RLDD je passe..."
else # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
D_RLDD="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2"
NbrF_D_RLDD=$(find "$D_RLDD" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
echo -e "\nD_CPC=$D_CPC\nD_RLDD=$D_RLDD"
echo "NbrF_D_CPC=$NbrF_D_CPC"
echo "NbrF_D_RLDD=$NbrF_D_RLDD"
# FIN valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if [ "$NbrF_D_RLDD" -gt "$NbrF_D_CPC" ]
then
# cas 1
echo " cas 1 MirSup : $NbrF_D_RLDD>$NbrF_D_CPC"
Mir=1
elif [ "$NbrF_D_RLDD" -lt "$NbrF_D_CPC" ]
then
echo "cas 2 MirInf : $NbrF_D_RLDD<$NbrF_D_CPC"
Mir=2
else
echo "cas 3 MirEgal : $NbrF_D_RLDD=$NbrF_D_CPC"
Mir=3
fi
# ****************************************************************************************************
# Pour chaque fichier dans ListeFic_D_RLDD déterminer si est un doublon,
# nécessite de séparer Dossier" § "Fichier dans la listeFic_D_RLDD pour que le Grep fontionne
# DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
case "$Mir" in # Case $Mir
1) # Case $Mir
echo " cas Miroir Plus suspendu cause# XXXX Debug2903"
;;
2) # Case $Mir
echo "Cas Miroir moins suspendu cause # XXXX Debug2903"
;;
3) # Case $Mir
echo "
Cas Miroir egal :"
# comparer les fichiers suivants de D_CPC pour valider qu'ils sont tous présents dans D_RLDD et inversement
# Traiter le cas plusieurs doublons dans D_CPC ou plusieurs mêmes doublons dans RLDD
# test dans source T5_D3.2_F2 en double et dans RepDoublon T5_D2.2
BoucleVrai=0
LFic_MD5_D_RLDD=$(cat "$CheminParamTMP/LFic_MD5_D_RLDD")
echo -e "\npour rappel LFic_MD5_D_RLDD :\n$LFic_MD5_D_RLDD"
while IFS="\n" read ExamMD5 # while1 ExamMD5
do # while1 ExamMD5
Trouv=$(echo "$LFic_MD5_D_RLDD" | grep -c "$ExamMD5") # compte le nombre d'occurence du fichier md5
echo -e "\nLFic_MD5_D_RLDD=$LFic_MD5_D_RLDD\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"
if [ "$Trouv" -eq 0 ]
then
echo "BoucleVrai :$BoucleVrai"
else
BoucleVrai=$(("$BoucleVrai" + 1))
echo " (Pour valider que chaque fichier a un doublon, il est comptabilisé uniquement 1 et non $Trouv) BoucleVrai +1=$BoucleVrai"
fi
done <"$CheminParamTMP/LMD5_D_CPC" # while1 ExamMD5A
# DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
echo -e "\n conclusion doublons de $D_CPC dans $D_RLDD : "
if [ "$BoucleVrai" -eq "$NbrF_D_CPC" ] # IF condition 1 MiroirEGAL
then # IF condition 1 MiroirEGAL
echo -e "\nLA PREMIERE CONDITION EST VRAI,\n contrôle du respect de la seconde condition"
BoucleVrai=0
while IFS="§" read CheminFichierRLDD ExamMD5 # while2 ExamMD5
do # while2 ExamMD5
Trouv=$(echo "$LMD5_D_CPC" | grep -c "$ExamMD5") # compte le nombre d'occurence du fichier md5
echo -e "\n\$LMD5_D_CPC=$LMD5_D_CPC\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"
if [ "$Trouv" -eq 0 ]
then
echo "BoucleVrai :$BoucleVrai"
else
BoucleVrai=$(("$BoucleVrai" + 1))
echo " BoucleVrai +1=$BoucleVrai"
fi
done <"$CheminParamTMP/LFic_MD5_D_RLDD" # while2 ExamMD5
# FermeRedirectionS
echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
echo -e "\n---------------------------------------------\n conclusion : "
# DEBUT3 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if [ "$BoucleVrai" -eq "$NbrF_D_RLDD" ] # If SECONDE CONDITION
then # If SECONDE CONDITION
if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>> OUVRE la redirection stdout selon mode verbeux ou non Affiche texte suivant dans les 2 cas
then
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
echo "Verbeux=$Verbeux"
echo -e "\nLA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n" | tee -a "$CheminJournal" | tee -a "$CheminJournalDeveloppeur"
else
echo "Verbeux=$Verbeux"
echo -e "\n LA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n" | tee -a "$CheminJournal"
fi
# set -x
unset itemAction2
if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>> OUVRE SELECT la redirection stdout selon mode verbeux ou non
then
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
fi
exec 2>$tty # Suspend la redirection d'erreur pour select
PS3="Choisir l'action"
select itemAction2 in "- Choix suppression de $D_RLDD" "- Choix suppression de $D_CPC"
do
echo "Le choix fait numéro:$REPLY >>>> $itemAction2"
# pour tester la variable de type entier :
if let $REPLY 2>/dev/null
then
echo "choix conforme"
case $REPLY in
1)
echo "MirMOINS appelé"
;;
2)
echo "MirPLUS appelé"
;;
*)
echo "Je sors .........."
break
;;
esac
break
else
echo "Entrée erronée ! variable non numérique"
fi
set +x
done
echo " terminé..."
else # If SECONDE CONDITION
echo "SECONDE CONDITION NON VALIDÉE : EST FAUX $D_CPC n'est pas miroir Sup de $D_RLDD"
fi # If SECONDE CONDITION
else # IF condition 1 MiroirEGAL
echo " PREMIERE CONDITION : EST FAUX $D_RLDD n'est pas miroir Sup de $D_CPC"
fi # IF condition 1 MiroirEGAL
;;
*) # Case $Mir
echo "Le cas Mir n'est pas défini : ne devrait pas se produire "
# M B2903
break
;;
esac # Case $Mir
fi # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
# ==================TBF8 ==============================================================
# Boucle while fin
done <"$RegroupRLDD" # parcours de la liste des dossier contenant les doublons
# ==================TBF8FIn ==============================================================
# FermeRedirectionS
echo "
ci-dessous le fichier MiroirSupprimer :"
cat "$CheminMiroirSupprimer"
}
# ================================ Premiere redirections des erreurs =============================================================
# pour usage dans la suspension des redirections des erreurs
tty=$(tty)
# ==========================================================================================
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
# ==========================================================================================
CPCMiroir "$CheminParamTMP/SupprimerMIROIR.txt"
Pour faire rourner le test il vous faudrait
Les paramètres forcés
et recréer le repertoire T6_Racine/ avec ces fichiers doublons
Vous les faut-ils ?
Merci
Hors ligne
#27 Le 18/04/2021, à 07:02
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Bonjour,
J'ai trouvé une solution qui marche dans mon test mais pas tout à fait dans mon script complet :
Traitement de while modifié dans le test (et le script complet)
echo "$RegroupRLDD" | while IFS="\n" read D_RLDD #
Je me retrouve avec un soucis de
D_RLDD=/home/phil/DGit/JournalT6SavTestSauvegarde/TmpParametres/RegroupRLDD
au lieu de
D_RLDD=/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Je cherche pourquoi et reviendrai si je ne trouve pas
Merci
Hors ligne
#28 Le 18/04/2021, à 07:22
- nany
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Je réitère ma question : comment fais-tu pour t’y retrouver avec une indentation aléatoire ?
Ré-indentation (2 espaces) :
# paramètre en local test
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
JeSuisIci="$PWD"
CheminActionDbl="."
NomBatch="NomBatch"
if [[ ! -d "./Journal$NomBatch" ]]
then
mkdir -v "./Journal$NomBatch"
fi
CheminJournal="./Journal$NomBatch""LisezMoiJournalSauvegarde"
CheminJournalErreur="./JournalErreur"
CheminJournalDeveloppeur="./JournalDeveloppeur"
REP_ADMir="$CheminActionDbl/ActionDoublons.txt"
LFD=$(egrep -v '^§+' "$REP_ADMir")
if [[ ! -d "./Journal$NomBatch/TmpParametres" ]]
then
mkdir -v "./Journal$NomBatch/TmpParametres"
fi
CheminParamTMP="./Journal$NomBatch/TmpParametres"
RegroupRLDD="$CheminParamTMP/RegroupRLDD"
if [[ ! -f "$RegroupRLDD" ]]
then
touch "$RegroupRLDD"
else
truncate -s 0 "$RegroupRLDD"
fi
function verbeux(){
# ----------------------- Choix du mode d'affichage verbeux=conception ou non=usage
echo "Execution dans le mode verbeux = Afficher les paramètres et tous les messages...";
Verbeux="True"
#shift
}
while :; do
case $1 in
-h|-\?|--help)
usage # Display a usage synopsis.
exit
;;
-v|--verbeux)
# echo "Liste des arguments =$@"
# echo "nombre de paramètres : $#"
verbeux $2;
shift # decale les arguments vers la gauche
break
;;
--verbeux)
verbeux $2;
shift # decale les arguments vers la gauche
break
;;
-) # End of all options.
shift
break
;;
-?*)
printf 'Avertissement : Option inconnue sortie %s\n' "$1" >&2
exit
;;
*) # Default case: No more options, so break out of the loop.
break
esac
shift
done
CPCMiroir()
{
CheminMiroirSupprimer="$1"
if [[ ! -f "$CheminMiroirSupprimer" ]]
then
touch "$CheminMiroirSupprimer"
else
truncate -s 0 "$CheminMiroirSupprimer"
fi
echo ""
#Pour chaque élément CPCent
# Du 1er au dernier fichier de ce répertoire
# Trouver les n doublons
# Pour chaque doublons lister les répertoires Miroirs potentiels
# identifier si un RepDoublonsMiroir a déjà été identifié identique sur les doublons précédents
# Ne conserver de la liste des RepDoublonsMiroir que ceux qui sont déjà relevé
# Pour identifier Vrai un rep miroir doublons il faut
# Que tous les fichiers de rep source ou de repMiroirdoublons soient contenu l'un dans l'autre
# Identifier qui est miroir avec qui
# -------------------------------------------------------------------------------------------
# set -x
# comparer les fichiers suivants de RLDD pour valider qu'ils sont tous présents dans D_CPC
RegroupRLDD="$CheminParamTMP/RegroupRLDD"
if [[ ! -f "$RegroupRLDD" ]]
then
touch "$RegroupRLDD"
else
truncate -s 0 "$RegroupRLDD"
fi
# DEBUT valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
D_CPC="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2"
NbrF_D_CPC=$(find "$D_CPC" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
# Recupération des lignes donnant la liste des md5sum de chaque répertoire CPCent
ListeUniq_D_CPC=$(grep "$D_CPC §" "$REP_ADMir") # " §" nécessaire pour limiter la recherche à D_CPC sans les sous chemins
# liste des md5sum :
truncate -s 0 "$CheminParamTMP/LMD5_D_CPC"
echo "\$ListeUniq_D_CPC :"
echo "$ListeUniq_D_CPC"
LMD5_D_CPC=$(echo "$ListeUniq_D_CPC" | awk -F " § " '{print $6}')
echo " la liste \$LMD5_D_CPC :
$LMD5_D_CPC"
echo "$LMD5_D_CPC" >"$CheminParamTMP/LMD5_D_CPC" # est utilisé plus bas pour éviter sous shell
unset RLDD
while IFS="\n" read MD5Fic # While MD5Fic
do # Parcours des MD5sum du dossier D_CPC # While MD5Fic
# recherche de la liste des dossiers contenant les doublons de D_CPC dont le contenu est à comparer à D_CPC
RLDD[index++]=$(echo "$LFD" | grep "$MD5Fic" | awk -F " § " '{print $1}'| sort | uniq)
done <"$CheminParamTMP/LMD5_D_CPC" # While MD5Fic
echo "${RLDD[0]}"
nb_elements="${#RLDD[*]}"
hauteur="${#RLDD[@]}"
echo "nombres d'éléments dans le tableau RLDD = $nb_elements"
echo "hauteur du tableau RLDD = $hauteur"
# Parcours des répertoires contenant des doublons du répertoire D_CPC
# Chaque fichier de D_CPC avait une MD5sum en doublons dans 1 ou plusieurs dossiers RLDD.
# Ce dossier miroir RLDD peut être identique ou différent des autres RLDD miroir d'autres fichiers doublons de D_CPC
# Une fois ces dossiers identifiés pour limiter le nombre d'opérations, 1 première tache de regrpoupement de ces dossier parfois identique permet de limiter la durée de traitement
# Puis il est identifié dans chaque rep RLDD si le nombre de fichier peut correspondre à un cas miroir
# selon le resultat de la comparaison du nombre de fichiers entre D_CPC et RLDD examiné il est vérifié si l'hypothèse miroir est valide ou non
for FicRLDD in "${RLDD[@]}" # For FicRLDD
do # For FicRLDD
ligne=$(($ligne+1))
echo "ligne=$ligne"
echo "FicRLDD : ${FicRLDD}"
done # For FicRLDD
# Debut modif pour supprimer les lignes redondantes
echo -e "\n Regroupement des recherches :"
truncate -s 0 "$RegroupRLDD"
for FicRLDD in "${RLDD[@]}" # For2 FicRLDD
do # For2 FicRLDD
echo "${FicRLDD}" | while IFS="\n" read LigneRLDD # While LigneRLDD
do # While LigneRLDD
ResultRegroup=$(grep -c "$LigneRLDD" "$RegroupRLDD")
if [ "$ResultRegroup" -eq 0 ]
then
if [ "$LigneRLDD" != "$D_CPC" ]
then
# ajoute la ligne dans $RegroupRLDD
echo "$LigneRLDD" >> "$RegroupRLDD"
else
echo " la ligne $LigneRLDD ne doit pas être ajoutée "
fi
else
echo " la ligne $LigneRLDD existe déjà "
fi
done # While LigneRLDD
done # For2 FicRLDD
echo " resultat du regroupement : "
cat "$RegroupRLDD"
# ==================TBF8 ==============================================================
exec 2>$tty # Suspend la redirection d'erreur
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
# Cette forme ne chage rien : exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
while IFS="\n" read D_RLDD # =colonne 1 parcours de la liste des dossier contenant les doublons
do # parcours de la liste des dossier contenant les doublons
# comparaison des fichiers de chaque dossier pour déterminer si miroir ou non de D_CPC
# ==================TBF8 FIn ==============================================================
# nombre de fichier du dossier D_RLDD
if [ "$D_RLDD" == "$D_CPC" ] # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
then # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
echo "Dossier en cours $D_RLDD je passe..."
else # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
D_RLDD="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2"
NbrF_D_RLDD=$(find "$D_RLDD" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
echo -e "\nD_CPC=$D_CPC\nD_RLDD=$D_RLDD"
echo "NbrF_D_CPC=$NbrF_D_CPC"
echo "NbrF_D_RLDD=$NbrF_D_RLDD"
# FIN valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if [ "$NbrF_D_RLDD" -gt "$NbrF_D_CPC" ]
then
# cas 1
echo " cas 1 MirSup : $NbrF_D_RLDD>$NbrF_D_CPC"
Mir=1
elif [ "$NbrF_D_RLDD" -lt "$NbrF_D_CPC" ]
then
echo "cas 2 MirInf : $NbrF_D_RLDD<$NbrF_D_CPC"
Mir=2
else
echo "cas 3 MirEgal : $NbrF_D_RLDD=$NbrF_D_CPC"
Mir=3
fi
# ****************************************************************************************************
# Pour chaque fichier dans ListeFic_D_RLDD déterminer si est un doublon,
# nécessite de séparer Dossier" § "Fichier dans la listeFic_D_RLDD pour que le Grep fontionne
# DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
case "$Mir" in # Case $Mir
1) # Case $Mir
echo " cas Miroir Plus suspendu cause# XXXX Debug2903"
;;
2) # Case $Mir
echo "Cas Miroir moins suspendu cause # XXXX Debug2903"
;;
3) # Case $Mir
echo -e "\n\nCas Miroir egal :"
# comparer les fichiers suivants de D_CPC pour valider qu'ils sont tous présents dans D_RLDD et inversement
# Traiter le cas plusieurs doublons dans D_CPC ou plusieurs mêmes doublons dans RLDD
# test dans source T5_D3.2_F2 en double et dans RepDoublon T5_D2.2
BoucleVrai=0
LFic_MD5_D_RLDD=$(cat "$CheminParamTMP/LFic_MD5_D_RLDD")
echo -e "\npour rappel LFic_MD5_D_RLDD :\n$LFic_MD5_D_RLDD"
while IFS="\n" read ExamMD5 # while1 ExamMD5
do # while1 ExamMD5
Trouv=$(echo "$LFic_MD5_D_RLDD" | grep -c "$ExamMD5") # compte le nombre d'occurence du fichier md5
echo -e "\nLFic_MD5_D_RLDD=$LFic_MD5_D_RLDD\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"
if [ "$Trouv" -eq 0 ]
then
echo "BoucleVrai :$BoucleVrai"
else
BoucleVrai=$(("$BoucleVrai" + 1))
echo " (Pour valider que chaque fichier a un doublon, il est comptabilisé uniquement 1 et non $Trouv) BoucleVrai +1=$BoucleVrai"
fi
done <"$CheminParamTMP/LMD5_D_CPC" # while1 ExamMD5A
# DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
echo -e "\n conclusion doublons de $D_CPC dans $D_RLDD : "
if [ "$BoucleVrai" -eq "$NbrF_D_CPC" ] # IF condition 1 MiroirEGAL
then # IF condition 1 MiroirEGAL
echo -e "\nLA PREMIERE CONDITION EST VRAI,\n contrôle du respect de la seconde condition"
BoucleVrai=0
while IFS="§" read CheminFichierRLDD ExamMD5 # while2 ExamMD5
do # while2 ExamMD5
Trouv=$(echo "$LMD5_D_CPC" | grep -c "$ExamMD5") # compte le nombre d'occurence du fichier md5
echo -e "\n\$LMD5_D_CPC=$LMD5_D_CPC\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"
if [ "$Trouv" -eq 0 ]
then
echo "BoucleVrai :$BoucleVrai"
else
BoucleVrai=$(("$BoucleVrai" + 1))
echo " BoucleVrai +1=$BoucleVrai"
fi
done <"$CheminParamTMP/LFic_MD5_D_RLDD" # while2 ExamMD5
# FermeRedirectionS
echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
echo -e "\n---------------------------------------------\n conclusion : "
# DEBUT3 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if [ "$BoucleVrai" -eq "$NbrF_D_RLDD" ] # If SECONDE CONDITION
then # If SECONDE CONDITION
if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>> OUVRE la redirection stdout selon mode verbeux ou non Affiche texte suivant dans les 2 cas
then
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
echo "Verbeux=$Verbeux"
echo -e "\nLA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n" | tee -a "$CheminJournal" | tee -a "$CheminJournalDeveloppeur"
else
echo "Verbeux=$Verbeux"
echo -e "\n LA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n" | tee -a "$CheminJournal"
fi
# set -x
unset itemAction2
if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>> OUVRE SELECT la redirection stdout selon mode verbeux ou non
then
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
fi
exec 2>$tty # Suspend la redirection d'erreur pour select
PS3="Choisir l'action"
select itemAction2 in "- Choix suppression de $D_RLDD" "- Choix suppression de $D_CPC"
do
echo "Le choix fait numéro:$REPLY >>>> $itemAction2"
# pour tester la variable de type entier :
if let $REPLY 2>/dev/null
then
echo "choix conforme"
case $REPLY in
1)
echo "MirMOINS appelé"
;;
2)
echo "MirPLUS appelé"
;;
*)
echo "Je sors .........."
break
;;
esac
break
else
echo "Entrée erronée ! variable non numérique"
fi
set +x
done
echo " terminé..."
else # If SECONDE CONDITION
echo "SECONDE CONDITION NON VALIDÉE : EST FAUX $D_CPC n'est pas miroir Sup de $D_RLDD"
fi # If SECONDE CONDITION
else # IF condition 1 MiroirEGAL
echo " PREMIERE CONDITION : EST FAUX $D_RLDD n'est pas miroir Sup de $D_CPC"
fi # IF condition 1 MiroirEGAL
;;
*) # Case $Mir
echo "Le cas Mir n'est pas défini : ne devrait pas se produire "
# M B2903
break
;;
esac # Case $Mir
fi # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
# ==================TBF8 ==============================================================
# Boucle while fin
done <"$RegroupRLDD" # parcours de la liste des dossier contenant les doublons
# ==================TBF8FIn ==============================================================
# FermeRedirectionS
echo -e "\n\nci-dessous le fichier MiroirSupprimer :"
cat "$CheminMiroirSupprimer"
}
# ================================ Premiere redirections des erreurs =============================================================
# pour usage dans la suspension des redirections des erreurs
tty=$(tty)
# ==========================================================================================
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
# ==========================================================================================
CPCMiroir "$CheminParamTMP/SupprimerMIROIR.txt"
C’est plus lisible comme ça, non ?
Question :
Les lignes 25-31 de cet extrait se retrouvent à l’identique aux lignes 106-112, est-ce normal ?
C’est peut-être là ton problème car ça touche à $RegroupRLDD.
(Je n’ai pas testé car oui, il faudrait le répertoire avec ses fichiers doublons et la flemme d’en créer.)
Hors ligne
#29 Le 18/04/2021, à 08:00
- nany
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Le même extrait passé à la moulinette de ShellCheck :
#!/bin/bash
# paramètre en local test
#DateJ=$(date +%Y%m%d)
#HeureJ=$(date +%H%M)
#JeSuisIci="$PWD"
CheminActionDbl="."
NomBatch="NomBatch"
if [[ ! -d "./Journal$NomBatch" ]]
then
mkdir -v "./Journal$NomBatch"
fi
CheminJournal="./Journal$NomBatch""LisezMoiJournalSauvegarde"
CheminJournalErreur="./JournalErreur"
CheminJournalDeveloppeur="./JournalDeveloppeur"
REP_ADMir="$CheminActionDbl/ActionDoublons.txt"
LFD=$(grep -Ev '^§+' "$REP_ADMir")
if [[ ! -d "./Journal$NomBatch/TmpParametres" ]]
then
mkdir -v "./Journal$NomBatch/TmpParametres"
fi
CheminParamTMP="./Journal$NomBatch/TmpParametres"
RegroupRLDD="$CheminParamTMP/RegroupRLDD"
if [[ ! -f "$RegroupRLDD" ]]
then
touch "$RegroupRLDD"
else
truncate -s 0 "$RegroupRLDD"
fi
function verbeux(){
# ----------------------- Choix du mode d'affichage verbeux=conception ou non=usage
echo "Execution dans le mode verbeux = Afficher les paramètres et tous les messages...";
Verbeux="True"
#shift
}
while :; do
case $1 in
-h|-\?|--help)
usage # Display a usage synopsis.
exit
;;
-v|--verbeux)
# echo "Liste des arguments =$@"
# echo "nombre de paramètres : $#"
verbeux "$2";
shift # decale les arguments vers la gauche
break
;;
#--verbeux)
#verbeux $2;
#shift # decale les arguments vers la gauche
#break
#;;
-) # End of all options.
shift
break
;;
-?*)
printf 'Avertissement : Option inconnue sortie %s\n' "$1" >&2
exit
;;
*) # Default case: No more options, so break out of the loop.
break
esac
shift
done
CPCMiroir()
{
CheminMiroirSupprimer="$1"
if [[ ! -f "$CheminMiroirSupprimer" ]]
then
touch "$CheminMiroirSupprimer"
else
truncate -s 0 "$CheminMiroirSupprimer"
fi
echo ""
#Pour chaque élément CPCent
# Du 1er au dernier fichier de ce répertoire
# Trouver les n doublons
# Pour chaque doublons lister les répertoires Miroirs potentiels
# identifier si un RepDoublonsMiroir a déjà été identifié identique sur les doublons précédents
# Ne conserver de la liste des RepDoublonsMiroir que ceux qui sont déjà relevé
# Pour identifier Vrai un rep miroir doublons il faut
# Que tous les fichiers de rep source ou de repMiroirdoublons soient contenu l'un dans l'autre
# Identifier qui est miroir avec qui
# -------------------------------------------------------------------------------------------
# set -x
# comparer les fichiers suivants de RLDD pour valider qu'ils sont tous présents dans D_CPC
RegroupRLDD="$CheminParamTMP/RegroupRLDD"
if [[ ! -f "$RegroupRLDD" ]]
then
touch "$RegroupRLDD"
else
truncate -s 0 "$RegroupRLDD"
fi
# DEBUT valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
D_CPC="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2"
NbrF_D_CPC=$(find "$D_CPC" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
# Recupération des lignes donnant la liste des md5sum de chaque répertoire CPCent
ListeUniq_D_CPC=$(grep "$D_CPC §" "$REP_ADMir") # " §" nécessaire pour limiter la recherche à D_CPC sans les sous chemins
# liste des md5sum :
truncate -s 0 "$CheminParamTMP/LMD5_D_CPC"
echo "\$ListeUniq_D_CPC :"
echo "$ListeUniq_D_CPC"
LMD5_D_CPC=$(echo "$ListeUniq_D_CPC" | awk -F " § " '{print $6}')
echo " la liste \$LMD5_D_CPC :
$LMD5_D_CPC"
echo "$LMD5_D_CPC" >"$CheminParamTMP/LMD5_D_CPC" # est utilisé plus bas pour éviter sous shell
unset RLDD
while IFS=$'\n' read -r MD5Fic # While MD5Fic
do # Parcours des MD5sum du dossier D_CPC # While MD5Fic
# recherche de la liste des dossiers contenant les doublons de D_CPC dont le contenu est à comparer à D_CPC
RLDD[index++]=$(echo "$LFD" | grep "$MD5Fic" | awk -F " § " '{print $1}'| sort | uniq)
done <"$CheminParamTMP/LMD5_D_CPC" # While MD5Fic
echo "${RLDD[0]}"
nb_elements="${#RLDD[*]}"
hauteur="${#RLDD[@]}"
echo "nombres d'éléments dans le tableau RLDD = $nb_elements"
echo "hauteur du tableau RLDD = $hauteur"
# Parcours des répertoires contenant des doublons du répertoire D_CPC
# Chaque fichier de D_CPC avait une MD5sum en doublons dans 1 ou plusieurs dossiers RLDD.
# Ce dossier miroir RLDD peut être identique ou différent des autres RLDD miroir d'autres fichiers doublons de D_CPC
# Une fois ces dossiers identifiés pour limiter le nombre d'opérations, 1 première tache de regrpoupement de ces dossier parfois identique permet de limiter la durée de traitement
# Puis il est identifié dans chaque rep RLDD si le nombre de fichier peut correspondre à un cas miroir
# selon le resultat de la comparaison du nombre de fichiers entre D_CPC et RLDD examiné il est vérifié si l'hypothèse miroir est valide ou non
for FicRLDD in "${RLDD[@]}" # For FicRLDD
do # For FicRLDD
ligne=$((ligne+1))
echo "ligne=$ligne"
echo "FicRLDD : ${FicRLDD}"
done # For FicRLDD
# Debut modif pour supprimer les lignes redondantes
echo -e "\n Regroupement des recherches :"
truncate -s 0 "$RegroupRLDD"
for FicRLDD in "${RLDD[@]}" # For2 FicRLDD
do # For2 FicRLDD
echo "${FicRLDD}" | while IFS=$'\n' read -r LigneRLDD # While LigneRLDD
do # While LigneRLDD
ResultRegroup=$(grep -c "$LigneRLDD" "$RegroupRLDD")
if [ "$ResultRegroup" -eq 0 ]
then
if [ "$LigneRLDD" != "$D_CPC" ]
then
# ajoute la ligne dans $RegroupRLDD
echo "$LigneRLDD" >> "$RegroupRLDD"
else
echo " la ligne $LigneRLDD ne doit pas être ajoutée "
fi
else
echo " la ligne $LigneRLDD existe déjà "
fi
done # While LigneRLDD
done # For2 FicRLDD
echo " resultat du regroupement : "
cat "$RegroupRLDD"
# ==================TBF8 ==============================================================
exec 2>"$tty" # Suspend la redirection d'erreur
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
# Cette forme ne chage rien : exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
while IFS=$'\n' read -r D_RLDD # =colonne 1 parcours de la liste des dossier contenant les doublons
do # parcours de la liste des dossier contenant les doublons
# comparaison des fichiers de chaque dossier pour déterminer si miroir ou non de D_CPC
# ==================TBF8 FIn ==============================================================
# nombre de fichier du dossier D_RLDD
if [ "$D_RLDD" == "$D_CPC" ] # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
then # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
echo "Dossier en cours $D_RLDD je passe..."
else # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
D_RLDD="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2"
NbrF_D_RLDD=$(find "$D_RLDD" -maxdepth 1 -not -path '*/\.*' -type f | wc -l)
echo -e "\nD_CPC=$D_CPC\nD_RLDD=$D_RLDD"
echo "NbrF_D_CPC=$NbrF_D_CPC"
echo "NbrF_D_RLDD=$NbrF_D_RLDD"
# FIN valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if [ "$NbrF_D_RLDD" -gt "$NbrF_D_CPC" ]
then
# cas 1
echo " cas 1 MirSup : $NbrF_D_RLDD>$NbrF_D_CPC"
Mir=1
elif [ "$NbrF_D_RLDD" -lt "$NbrF_D_CPC" ]
then
echo "cas 2 MirInf : $NbrF_D_RLDD<$NbrF_D_CPC"
Mir=2
else
echo "cas 3 MirEgal : $NbrF_D_RLDD=$NbrF_D_CPC"
Mir=3
fi
# ****************************************************************************************************
# Pour chaque fichier dans ListeFic_D_RLDD déterminer si est un doublon,
# nécessite de séparer Dossier" § "Fichier dans la listeFic_D_RLDD pour que le Grep fontionne
# DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
case "$Mir" in # Case $Mir
1) # Case $Mir
echo " cas Miroir Plus suspendu cause# XXXX Debug2903"
;;
2) # Case $Mir
echo "Cas Miroir moins suspendu cause # XXXX Debug2903"
;;
3) # Case $Mir
echo -e "\n\nCas Miroir egal :"
# comparer les fichiers suivants de D_CPC pour valider qu'ils sont tous présents dans D_RLDD et inversement
# Traiter le cas plusieurs doublons dans D_CPC ou plusieurs mêmes doublons dans RLDD
# test dans source T5_D3.2_F2 en double et dans RepDoublon T5_D2.2
BoucleVrai=0
LFic_MD5_D_RLDD=$(cat "$CheminParamTMP/LFic_MD5_D_RLDD")
echo -e "\npour rappel LFic_MD5_D_RLDD :\n$LFic_MD5_D_RLDD"
while IFS=$'\n' read -r ExamMD5 # while1 ExamMD5
do # while1 ExamMD5
Trouv=$(echo "$LFic_MD5_D_RLDD" | grep -c "$ExamMD5") # compte le nombre d'occurence du fichier md5
echo -e "\nLFic_MD5_D_RLDD=$LFic_MD5_D_RLDD\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"
if [ "$Trouv" -eq 0 ]
then
echo "BoucleVrai :$BoucleVrai"
else
BoucleVrai=$(("$BoucleVrai" + 1))
echo " (Pour valider que chaque fichier a un doublon, il est comptabilisé uniquement 1 et non $Trouv) BoucleVrai +1=$BoucleVrai"
fi
done <"$CheminParamTMP/LMD5_D_CPC" # while1 ExamMD5A
# DEBUT2 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
echo -e "\n conclusion doublons de $D_CPC dans $D_RLDD : "
if [ "$BoucleVrai" -eq "$NbrF_D_CPC" ] # IF condition 1 MiroirEGAL
then # IF condition 1 MiroirEGAL
echo -e "\nLA PREMIERE CONDITION EST VRAI,\n contrôle du respect de la seconde condition"
BoucleVrai=0
while IFS="§" read -r CheminFichierRLDD ExamMD5 # while2 ExamMD5 ########### variable $CheminFichierRLDD non utilisée par la suite ############
do # while2 ExamMD5
Trouv=$(echo "$LMD5_D_CPC" | grep -c "$ExamMD5") # compte le nombre d'occurence du fichier md5
echo -e "\n\$LMD5_D_CPC=$LMD5_D_CPC\nExamMD5=$ExamMD5\n => Trouv=$Trouv\n"
if [ "$Trouv" -eq 0 ]
then
echo "BoucleVrai :$BoucleVrai"
else
BoucleVrai=$(("$BoucleVrai" + 1))
echo " BoucleVrai +1=$BoucleVrai"
fi
done <"$CheminParamTMP/LFic_MD5_D_RLDD" # while2 ExamMD5
# FermeRedirectionS
echo -e "\$NbrF_D_CPC=$NbrF_D_CPC\nBoucleVrai=$BoucleVrai"
echo -e "\n---------------------------------------------\n conclusion : "
# DEBUT3 valeurs forcées pour le test <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if [ "$BoucleVrai" -eq "$NbrF_D_RLDD" ] # If SECONDE CONDITION
then # If SECONDE CONDITION
if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>> OUVRE la redirection stdout selon mode verbeux ou non Affiche texte suivant dans les 2 cas
then
exec 1>"$tty" # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
echo "Verbeux=$Verbeux" ######## $NbrF0_D_RLDD non assigneé dans la ligne suivante #########
echo -e "\nLA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n" | tee -a "$CheminJournal" | tee -a "$CheminJournalDeveloppeur"
else
echo "Verbeux=$Verbeux"
echo -e "\n LA SECONDE CONDITION EST VRAI, \n VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\n$D_RLDD est miroir EGAL du dossier Cent Pour cent suivant\n Le dossier $D_CPC\n Un des 2 peut être supprimé\nVVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===VVV===\nDans $D_RLDD :\n Nombre de fichiers $NbrF_D_RLDD\n Nombre de fichiers non doublons :$NbrF0_D_RLDD\n ---------------------------------------------\n" | tee -a "$CheminJournal"
fi
# set -x
unset itemAction2
if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>> OUVRE SELECT la redirection stdout selon mode verbeux ou non
then
exec 1>"$tty" # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
fi
exec 2>"$tty" # Suspend la redirection d'erreur pour select
PS3="Choisir l'action"
select itemAction2 in "- Choix suppression de $D_RLDD" "- Choix suppression de $D_CPC"
do
echo "Le choix fait numéro:$REPLY >>>> $itemAction2"
# pour tester la variable de type entier :
if (( REPLY )) 2>/dev/null
then
echo "choix conforme"
case $REPLY in
1)
echo "MirMOINS appelé"
;;
2)
echo "MirPLUS appelé"
;;
*)
echo "Je sors .........."
break
;;
esac
break
else
echo "Entrée erronée ! variable non numérique"
fi
set +x
done
echo " terminé..."
else # If SECONDE CONDITION
echo "SECONDE CONDITION NON VALIDÉE : EST FAUX $D_CPC n'est pas miroir Sup de $D_RLDD"
fi # If SECONDE CONDITION
else # IF condition 1 MiroirEGAL
echo " PREMIERE CONDITION : EST FAUX $D_RLDD n'est pas miroir Sup de $D_CPC"
fi # IF condition 1 MiroirEGAL
;;
*) # Case $Mir
echo "Le cas Mir n'est pas défini : ne devrait pas se produire "
# M B2903
break
;;
esac # Case $Mir
fi # IF sortie de la boucle déclenchée si D_RLDD est le D_CPC
# ==================TBF8 ==============================================================
# Boucle while fin
done <"$RegroupRLDD" # parcours de la liste des dossier contenant les doublons
# ==================TBF8FIn ==============================================================
# FermeRedirectionS
echo -e "\n\nci-dessous le fichier MiroirSupprimer :"
cat "$CheminMiroirSupprimer"
}
# ================================ Premiere redirections des erreurs =============================================================
# pour usage dans la suspension des redirections des erreurs
tty=$(tty)
# ==========================================================================================
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
# ==========================================================================================
CPCMiroir "$CheminParamTMP/SupprimerMIROIR.txt"
J’ai laissé deux erreurs (mais commenté) sur des variables (une non utilisée et l’autre non renseignée).
Hors ligne
#30 Le 18/04/2021, à 12:05
- Watael
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
5700 lignes ! ça ne me semble pas raisonnable. mais qu'est-ce qu'il fait ce script ? le petit déjeuner (du café, des œufs (au plat brouillés...), du bacon, des haricots...), le déjeuner, l'apéro, et le dîner ?
ne devrais-tu pas (si possible) le scinder en plusieurs scripts ? il doit bien y avoir des sous-ensembles.
bon, c'est pas tout ça, mais j'ai "un peu" de lecture, maintenant.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#31 Le 18/04/2021, à 18:04
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Bonjour,
Merci Nany
Je réitère ma question : comment fais-tu pour t’y retrouver avec une indentation aléatoire ?
Je ne m'y retrouve pas facilement, je commente les fins de lignes des boucles, c'est lourding, il faudra que je me penche sur une méthode fiable,
j'ai du mal à gérer des indentations correctes, J'utilise vim mais parfois lors de corrections de lignes les indentations changent, c'est vite désordonnés. As-tu une manière de faire à conseiller à part être vigilant ?
C’est plus lisible comme ça, non ?
Oui mais tu fais comment pour que cela ne change pas au cours des corrections ?
As-tu une méthode automatique ?
Question :
Les lignes 25-31 de cet extrait se retrouvent à l’identique aux lignes 106-112, est-ce normal ?
"OUI" c'est une erreur du script , ce script n'est qu'une reprise du script complet expurgé d'un maximum de ligne pour identifier les lignes de mon bug
Le même extrait passé à la moulinette de ShellCheck :
Je ne connais pas SellCheck, merci, j'aime bien apprendre. Il faut que je cherche de la doc, le lien donné ne m'explique pas grand chose
Je conçois que cela peut paraître bizarre mais je reste novice en programmation, (même si j'ai fais des progrès en grande parti grâce aux membres du forum)
je fais cela à temps perdu, (et je n'ai pas toujours beaucoup de temps à perdre), d'où parfois des pauses dans mes questions réponses sur le forum.
Merci pour votre patience à tous
Merci Watael
ne devrais-tu pas (si possible) le scinder en plusieurs scripts
Non,
initialement il était diviser en fonctions distinctes mais la gestion globale n'était pas évidente, surtout qu'en j'ai pris l'idée d'en faire 3 versions en 1
1 version utilisateur qui masque tout le déroulé
1 version développeurs qui montrent un maximum de paramètres
1 mémorisation des actions dans plusieurs journaux
mais qu'est-ce qu'il fait ce script ? le petit déjeuner (du café, des œufs (au plat brouillés...), du bacon, des haricots...), le déjeuner, l'apéro, et le dîner
Ce script était à la base pour renforcer mon apprentissage de shell, en réalisant une fonctionnalité qui m'intéressait, économiser de l'espace de mes disques durs de sauvegarde en particulier pour les photos et videos
Comme cela fait toute une vie que j'accumule à gauche à droite, que je classe, renomme, reclasse, oubli, rereclasse, et ne tri pas de peur de supprimer des souvenirs qui me sont précieux, je finis par avoir un capharnaüm de disques de dossiers et il y a pas mal de doublons. Avc la taille des disque d'aujourd'hui le tri est ingérable à la main
Bref ce script à l'ambition de gérer les sauvegardes et de détecter, avertir quand une sauvegarde tombe sur des doublons. Il propose des suppressions globales par diverses astuces que j'ai petit à petit construites. Plus tard je m'attaquerai à lui faire faire le café...:cool:
Hors ligne
#32 Le 18/04/2021, à 19:29
- nany
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Je ne m'y retrouve pas facilement, je commente les fins de lignes des boucles, c'est lourding, il faudra que je me penche sur une méthode fiable,
j'ai du mal à gérer des indentations correctes, J'utilise vim mais parfois lors de corrections de lignes les indentations changent, c'est vite désordonnés. As-tu une manière de faire à conseiller à part être vigilant ?
À part être vigilant, rien.
mais tu fais comment pour que cela ne change pas au cours des corrections ?
As-tu une méthode automatique ?
Pas de méthode automatique. Ça demande de la rigueur et il se trouve que j’en ai beaucoup.
Je ne connais pas SellCheck, merci, j'aime bien apprendre. Il faut que je cherche de la doc, le lien donné ne m'explique pas grand chose
Ben tu passes un script dans ShellCheck et il donne ensuite des indications sur les erreurs d’écriture qu’il a détectées.
Tout n’est pas forcément à prendre au pied de la lettre. Il y a des liens qui donnent des explications sur les erreurs avec des exceptions possibles.
Tu peux aussi l’utiliser en local :
sudo apt install shellcheck
Hors ligne
#33 Le 18/04/2021, à 21:31
- kamaris
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Je n'ai pas testé, mais comme je disais plus haut, je pense que c'est parce que l'entrée standard est déjà mobilisée.
Dans cette boucle while :
while IFS="\n" read D_RLDD # =colonne 1 parcours de la liste des dossier contenant les doublons
do # parcours de la liste des dossier contenant les doublons
…
done <"$RegroupRLDD" # parcours de la liste des dossier contenant les doublons
elle est prise par "$RegroupRLDD".
Essaie d'utiliser un descripteur de fichier pour lire "$RegroupRLDD" :
exec 3<"$RegroupRLDD"
while IFS="\n" read -u3 D_RLDD # =colonne 1 parcours de la liste des dossier contenant les doublons
do # parcours de la liste des dossier contenant les doublons
…
done # parcours de la liste des dossier contenant les doublons
exec 3<&-
et garde ainsi ton entrée standard libre pour le select.
Dernière modification par kamaris (Le 18/04/2021, à 21:34)
En ligne
#34 Le 20/04/2021, à 18:29
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Bonjour,
Merci Kamaris, J'ai essayé ta correction
cela ne semble pas être correct
le code modifié
exec 3<"$RegroupRLDD"
while IFS="\n" read -u3 D_RLDD # =colonne 1 parcours de la liste des dossier contenant les doublons
do
...
done <"$RegroupRLDD" # parcours de la liste des dossier contenant les doublons
Le retour :
....
Nombre de fichiers 4
Nombre de fichiers non doublons :
---------------------------------------------
1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'action
terminé...
Le select n'a pas fonctionné
La correction
echo "$RegroupRLDD" | while IFS="\n" read D_RLDD
me semblait pouvoir résoudre le problème dans le code test
mais en fait non
La ligne
echo "
Liste des fichiers de $D_RLDD :"
affiche
Liste des fichiers de /home/phil/DGit/JournalT6SavTestSauvegarde/TmpParametres/RegroupRLDD
au lieu de m'afficher
Liste des fichiers de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
Merci
Hors ligne
#35 Le 20/04/2021, à 20:32
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Bonjour,
J'ai trouvé une de mes erreurs (il en reste...)
il fallait ecrire :
cat "$RegroupRLDD" | while IFS="\n" read D_RLDD
(bon ... sans commentaire, on ne rigole pas!:()
Je cherche à mieux expliquer l'erreur restante et je reviens
Hors ligne
#36 Le 20/04/2021, à 20:42
- nany
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
IFS=$'\n'
Hors ligne
#37 Le 20/04/2021, à 21:32
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Bonjour,
Merci nany
Je prends la correction, mais pour le moment cela ne semble pas influencer le résultat du code.
Je vais repartir sur la construction d'un test qui j'espère m'aidera à trouver comment traiter correctement la redirection
Hors ligne
#38 Le 20/04/2021, à 21:52
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
nany je reviens sur ta suggestion de correction
J'ai lu ton lien, j'ai testé les 2 formes je ne vois pas d'influence de
IFS=$'\n'
Un exemple peut-être pour me convaincre de la nécessité de tous les corriger. Est-ce crucciale de remplacer tous mes IFS="\n" ?
Merci
Hors ligne
#39 Le 20/04/2021, à 22:41
- nany
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Un exemple peut-être pour me convaincre de la nécessité de tous les corriger.
echo "\n"
vs
echo $'\n'
Hors ligne
#40 Le 21/04/2021, à 00:34
- kamaris
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
@philoeil : Attention, tu n'as pas bien lu ce que j'ai indiqué en #33, il ne doit plus y avoir de <"$RegroupRLDD" à la fin de la boucle while (c'est justement le but : libérer l'entrée standard).
Autre précision si nécessaire : j'ai utilisé 3 comme descripteur, mais si tu l'utilises déjà avant, il faut monter plus haut : 4, 5, 6…
Dernière remarque : le descripteur doit être fermé après la boucle while, comme je l'ai indiqué dans mon exemple : exec 3<&-.
Essaie de bien suivre cela, car je pense que ça devrait résoudre ton problème.
En ligne
#41 Le 21/04/2021, à 15:12
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Bonjour,
Merci nany
ton exemple dans le cas echo est parlant : (je n'arrive pas à l'afficher dans la réponse forum : le retour ligne n'apparait pas à l'affichage)
phil@phil-G750JH:~/Documents/JeCodeShell/TestIFS$ echo "\n"
\n
phil@phil-G750JH:~/Documents/JeCodeShell/TestIFS$ echo $'\n'
mais le test que je fais pour IFS lui ne change rien. Quelle conséquence ou intérêt de l'usage de l'un ou l'autre :
$ cat LMD5_D_CPC
48cf9676491\n2ca3194157bf605dc4c8f
5edfbe7e054f\tdd5e9637eb5bb43f7857
95960f0379ce7\n75efd5ba1d7b393a4cb
95960f0379ce77\t5efd5ba1d7b393a4cb
#!/bin/bash
CheminParamTMP="."
while IFS="\n" read ExamMD5 # while1 ExamMD5
do # while1 ExamMD5
echo $ExamMD5
done <"$CheminParamTMP/LMD5_D_CPC" # while1 ExamMD5A
echo "seconde methode avec $'\n'"
while IFS=$'\n' read ExamMD5 # while1 ExamMD5
do # while1 ExamMD5
echo $ExamMD5
done <"$CheminParamTMP/LMD5_D_CPC" # while1 ExamMD5A
resultat :
$ ./TIFS1.sh
48cf9676491n2ca3194157bf605dc4c8f
5edfbe7e054ftdd5e9637eb5bb43f7857
95960f0379ce7n75efd5ba1d7b393a4cb
95960f0379ce77t5efd5ba1d7b393a4cb
seconde methode avec $'\n'
48cf9676491n2ca3194157bf605dc4c8f
5edfbe7e054ftdd5e9637eb5bb43f7857
95960f0379ce7n75efd5ba1d7b393a4cb
95960f0379ce77t5efd5ba1d7b393a4cb
Je n'ai sans doute pas compris quelque chose ...
Merci Kamaris je reteste et ferai un retour
Hors ligne
#42 Le 21/04/2021, à 15:56
- kamaris
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Je n'ai sans doute pas compris quelque chose ...
The shell treats each character of IFS as a delimiter, and splits the results of the other expansions into words using these characters as field terminators.
IFS='\n' read -r v1 v2 v3 <<<'a\bnc'
echo "v1: '$v1'"
echo "v2: '$v2'"
echo "v3: '$v3'"
donne :
v1: 'a'
v2: 'b'
v3: 'c'
Alors que
IFS=$'\n' read -r v1 v2 v3 <<<'a\bnc'
echo "v1: '$v1'"
echo "v2: '$v2'"
echo "v3: '$v3'"
donne :
v1: 'a\bnc'
v2: ''
v3: ''
En ligne
#43 Le 21/04/2021, à 19:35
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Double merci Kamaris
Pour l'explication précédente parfaitement claire
et
pour la solution qui corrige le problème du test
exec 6<"$RegroupRLDD"
while IFS="\n" read -u6 D_RLDD # =colonne 1 parcours de la liste des dossiers contenant les doublons
do # parcours de la liste des dossiers contenant les doublons
...
# parcours de la liste des dossiers contenant les doublons
done
exec 6<&-
resultat
...
1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D3/T5_D3.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'action1
Le choix fait numéro:1 >>>> - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D3/T5_D3.2
choix conforme
MirMOINS appelé
terminé...
Il me reste à trouver pourquoi dans le script complet la solution ne fonctionne pas...
Je cherche un peu et reviendrai (:))
Hors ligne
#44 Le 21/04/2021, à 19:38
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Remarque : désolé je n'avais pas corrigé l'IFS. Je vais le faire de suite....
Hors ligne
#45 Le 21/04/2021, à 20:37
- kamaris
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Si les boucles sont imbriquées, les choses peuvent devenir plus compliquées, même si pas fondamentalement différentes.
Si tu utilises systématiquement des descripteurs pour lire tes fichiers, en prenant bien soin de les fermer dès lors qu'ils ne sont plus utilisés (ce qui te permet de les réutiliser ensuite à niveau d'imbrication constant), et que tu ne rediriges plus l'entrée standard à aucun endroit des 57 891 lignes de ton script , alors le select devrait fonctionner comme attendu.
En ligne
#46 Le 21/04/2021, à 20:55
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Pour préciser l'erreur du script entier :
Le journal des erreurs renvoie en fin d'execution :
1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action1) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D2/T5_D2.2
2) - Choix suppression de /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T6_Racine/T5_D1/MirEgal_De_T5_D2.2
Choisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'actionChoisir l'action
ce qui correspond bien à la succession des select non traités et envoyés dans le canal 2
Peut-être une explication sommaire du déroulement pourrait vous aider à me faire trouver ou les redirections (comme montrées par Kamaris précédemment #42) sont nécessaires
1) appel de la fonction CPCMiroir
2) Une Grosse boucle1
# Boucle parcours des D_CPC
while IFS=$'\n' read D_CPC # While Boucle parcours des D_CPC
3) Dans la grosse boucle 1
3.1) une petite boucle
while IFS=$'\n' read MD5Fic
do # Parcours des MD5sum du dossier D_CPC
# recherche de la liste des dossiers contenant les doublons de D_CPC dont le contenu est à comparer à D_CPC
RLDD[index++]=$(echo "$LFD" | grep "$MD5Fic" | awk -F " § " '{print $1}'| sort | uniq)
done <"$CheminParamTMP/LMD5_D_CPC"
3.2 une petite boucle for affichant le contenu du tableau précédent
3.3 une boucle for avec dedans une boucle while
for FicRLDD in "${RLDD[@]}"
do
echo "${FicRLDD}" | while IFS=$'\n' read LigneRLDD
...
done # While LigneRLDD
done # For2 FicRLDD
3.4 la boucle while (corrigé par kamaris dans le test)
exec 6<"$RegroupRLDD"
while IFS=$'\n' read -u6 D_RLDD # =colonne 1 parcours de la liste des dossiers contenant les doublons
do
...
done
3.4.1 une boucle while
while IFS=$'\n' read Fic_D_RLDD # Pour chaque fichier dans ListeFic_D_RLDD
do # Pour chaque fichier dans ListeFic_D_RLDD
...
done <"$CheminParamTMP/ListeFic_D_RLDD"
3.4.2 une boucle case
case "$Mir" in
1) # une boucle while
while IFS=$'\n' read ExamMD5 # while1 ExamMD5
do # while1 ExamMD5
...
done <"$CheminParamTMP/LMD5_D_CPC"
2) # une boucle while
while IFS="§" read CheminFichierRLDD ExamMD5 # while2 ExamMD5
do # while2 ExamMD5
...
done <"$CheminParamTMP/LFic_MD5_D_RLDD"
3) # une boucle while
while IFS=$'\n' read ExamMD5 # while1 ExamMD5
do # while1 ExamMD5
....
done <"$CheminParamTMP/LMD5_D_CPC"
# une seconde boucle while
while IFS="§" read CheminFichierRLDD ExamMD5 # while2 ExamMD5
do
...
done <"$CheminParamTMP/LFic_MD5_D_RLDD"
# une action select case
select itemAction2 in "- Choix suppression de $D_RLDD" "- Choix suppression de $D_CPC"
do
...
done
# fin boucle case 3.4.2
# fin boucle 3.4
done # parcours de la liste des dossiers contenant les doublons
exec 6<&-
...
Fin grosse boucle 2 :
done <"$CheminParamTMP/MIR_CPCent.txt" # While Boucle parcours des D_CPC
Merci pour tout
Hors ligne
#47 Le 21/04/2021, à 21:09
- kamaris
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
À la lecture de ça, il suffirait d'appliquer le traitement précédent à la boucle 2), c'est-à-dire à la seule autre boucle que la boucle 3.4) dans laquelle se trouve imbriqué le select parmi toutes celles que tu as citées.
Donc :
exec 3<"$CheminParamTMP/MIR_CPCent.txt"
while IFS=$'\n' read -u3 D_CPC # While Boucle parcours des D_CPC
do
…
done # While Boucle parcours des D_CPC
exec 3<&-
Évidemment, le 3 est à adapter si besoin, et surtout, les descripteurs utilisés ensuite dans cette boucle doivent être incrémentés en conséquence (dont celui de la boucle 3.4).
Dernière modification par kamaris (Le 21/04/2021, à 21:12)
En ligne
#48 Le 21/04/2021, à 21:39
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
en prenant bien soin de les fermer dès lors qu'ils ne sont plus utilisés (ce qui te permet de les réutiliser ensuite à niveau d'imbrication constant)
C'est là que je manque de maîtrise et j'ai sans doute besoin de quelques précisions (en passant je ne comprend pas très bien quand on doit dire j'ouvre ou je ferme un canal)
En début de programme j'ai
# ================================ Premiere redirections des erreurs =============================================================
# pour usage dans la suspension des redirections des erreurs
tty=$(tty)
# ==========================================================================================
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
# ==========================================================================================
la fonction CPCMiroir est appelé avec les canaux dans l'état "verbeux" défini au lancement
Cet état, quand j'appelle la fonction est
Selon le mode choisi lors du lancement du programme :
en 1 des 2 modes (que j'ai appelés verbeux et nonverbeux)
# mode verbeux
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
# Mode non verbeux
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
echo -e "\nToute sortie des commandes sera envoyée\t dans le fichier JournalDeveloppeur\tATTENTION >> Seul les informations essentielles s'affichent"
echo -e "Les erreurs sont envoyées dans stdout et "'$CheminJournalErreur'" et dans le JournalDeveloppeur\n\f"
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
exec >>"$CheminJournalDeveloppeur" # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur ATTENTION >> plus rien ne s'affiche sur stdout
J'ai peut-être bêtement utilisé le canal 5 j'aurais sans doute du utilisé le canal 3
puisque les 3 et 4 ne sont pas utilisés
Est-ce que ce que je fais est correct et est-ce suffisant pour ouvrir les canaux (sont-il tous correctement ouvert)?
En mode NONverbeux
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
exec 2>$tty # Suspend la redirection d'erreur
En mode verbeux
exec 2>$tty # Suspend la redirection d'erreur
Lancement de la commande (select ou While ou Read)
APRES execution de la commande
J'avais fait une fonction fermant les canaux : FermeRedirectionS()
FermeRedirectionS()
# validé pour select, while et read
{
if [[ ! "$Verbeux" == "True" ]] #<<<<<<<<<<<<<<<<<<<<<< ferme la redirection SELECT stdout selon mode verbeux ou non
then
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
#echo -e "\n====================\n FIN Test affichage SELECT Verbeux= FALSE\n========================\n" >>"$CheminJournalDeveloppeur"
exec >>"$CheminJournalDeveloppeur" # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
else
#echo -e "\n====================\n FIN Test affichage SELECT Verbeux = TRUE\n========================\n"
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
fi
Cette fonction de fermeture des canaux est-elle suffisante ? correcte?
Si je te suis, il me faut multiplier les ouvertures de canaux et fermetures après les commandes
mais quand est-ce nécessaire ? pour chaque boucle while, read, select dans la fonction CPCMiroir ou non ?
J'en suis la dans mes réflexions il me faut tester ou un peu d'aide...
Pour celui qui a suivi jusque là BRAVO! total respect;)
Merci
Hors ligne
#49 Le 21/04/2021, à 21:45
- philoeil
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Ok Kamaris nos messages ce sont croisés je vais essayé ta solution # 47
Selon les résultats je terminerai peut-être demain
Merci encore
Hors ligne
#50 Le 21/04/2021, à 22:03
- kamaris
Re : [RESOLU] erreur dans select (je ne trouve pas l'erreur)
Je ne vais pas répondre point par point à ton post #48, car ce serait trop long, ça deviendrait trop général, et probablement illisible et impossible à suivre.
Ce fil concerne le problème du select, uniquement lié selon moi à un problème de redirection de l'entrée standard : tâchons de résoudre ce problème, et restons en là pour ce fil .
Pour le reste, je te conseille tout d'abord la lecture de ce petit exposé en français (traduit de l'anglais) : https://xavcc.frama.io/introduction-stream/
Ensuite, si quelque chose ne fonctionne pas ou que tu as une question (pas trop générale si possible), je pense qu'il vaudrait mieux ouvrir un nouveau fil.
En ligne