#1 Le 30/04/2020, à 23:20
- philoeil
[RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour,
Je bloque sur la récupération des retours de fonction utilisateur appelé dans AWK :
TailleFic[$1]=$?; conduit à une erreur que je ne sais pas résoudre
Exemple
#!/bin/bash
echo ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Lancement' $0'
'
REP="/home/phil/ToutesSauvegardes/JournalSavTestSauvegarde/ActionDoublons.txt"
RepSource="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine"
echo '$REP='"$REP"
echo '$RepSource'"$RepSource"
#set -x
TailleFichier()
# 1Paramètre cheminFichier
{
TailleFic=(`wc -c $1`)
return $TailleFic
}
# --------------------------------------------- INFO 5 Taille des fichiers à supprimer4 ---------------------------------------------------------
TailleFichier $REP
echo $?
awk -v RepSource==\$RepSource 'BEGIN { print "\n ---------Début de Info5 Calcul taille des fichiers : "; FS=" § " }
{
if (/^\s*§+/) { next }
else
# printf ("la variable $1 est actuellement : ") $1;
{ NomRep[$1]=$1; NbRepDbl[$1]+=1; CheminNom[$1]=$1"/"$2; printf ("NomComplet >>>>>" CheminNom[$1] "<<<<<< NomRep " NomRep[$1] "--- Nbre Chps :" NF "---" $0" \n");
printf ("Taille de " CheminNom[$1] " :");
TailleFichier CheminNom[$1];
TailleFic[$1]=$?; printf TailleFic[$1];
# print "\n";
}
}
END { print " terminé " }'"$REP"
Resultat :
phil@phil-G750JH:~/Documents/JeCodeShell/TestAWK$ ./TestTaille1.sh
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Lancement ./TestTaille1.sh
$REP=/home/phil/ToutesSauvegardes/JournalSavTestSauvegarde/ActionDoublons.txt
$RepSource/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine
87
awk: ligne de commande:11: TailleFic[$1]=$?; printf TailleFic[$1];
awk: ligne de commande:11: ^ syntax error
awk: ligne de commande:19: END { print " terminé " }/home/phil/ToutesSauvegardes/JournalSavTestSauvegarde/ActionDoublons.txt
awk: ligne de commande:19: ^ syntax error
phil@phil-G750JH:~/Documents/JeCodeShell/TestAWK$
Pouvez-vous m'aider merci
Dernière modification par philoeil (Le 02/05/2020, à 17:35)
Hors ligne
#2 Le 30/04/2020, à 23:51
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Ta fonction est une fonction bash, pas une fonction awk.
Donc la syntaxe pour l'utiliser dans awk est la même que pour toute autre commande externe* : à travers les fonctions (awk) system() ou getline(), comme déjà vu précédemment.
Cependant, comme c'est une fonction et pas une commande accessible dans le PATH, il faut l'exporter pour qu'elle soit connue des sous-processus du shell où elle est définie :
export -f nom-de-la-fonction
Autre chose : il ne faut pas confondre le code retour d'une fonction (0 si tout s'est bien passé, différent de 0 sinon), et sa sortie.
Ici, tu détournes l'utilisation du code retour pour y mettre la sortie de la fonction, qui devrait donc plutôt s'écrire
TailleFichier() {
echo $(wc -c "$1")
}
Mais on voit que l'intérêt de cette fonction est limité, car elle n'est qu'un renommage de wc -c, que tu pourrais donc aussi bien appeler directement dans awk.
--
* Faux, sauf si sh pointe vers bash sur le système hôte : voir commentaire en #20.
Dernière modification par kamaris (Le 02/05/2020, à 16:25)
Hors ligne
#3 Le 30/04/2020, à 23:55
- Watael
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
ici, le echo ne sert à rien.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 30/04/2020, à 23:58
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
J'étais en train d'éditer mon message
Pour dire : le echo est d'ailleurs inutile, je ne l'ai mis que pour souligner la différence entre code retour et sortie.
Hors ligne
#5 Le 01/05/2020, à 00:38
- Watael
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
oops.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 01/05/2020, à 08:24
- philoeil
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour, Merci à tous et Merci Kamaris
Je n'y comprend pas grand chose merci pour ta patience...
il faut l'exporter pour qu'elle soit connue des sous-processus du shell où elle est définie :
export -f nom-de-la-fonction
Où ce place cette déclaration dans le script bash?
Je ne sais pas comment récupérer afficher le resultat de ma fonction apres mon appel à celle-ci depuis le corps actions de macommande AWK
Je ne sais pas comment executer directement la commande
(wc -c $1)
et l'afficher dans le corps action du script AWK
ci-dessous mon code modifié (qui échoue) et te montre l'étendue de ma méconnaissance
Si tu peux m'aider à comprendre mes erreurs, J'ai essayé ceci mais c'est apparemment complètement faux
printf ("Taille de " CheminNom[$1] " :");
TailleFic[$1]=sprintf("wc -c %d", CheminNom[$1]);
printf TailleFichier CheminNom[$1];
TailleFichier CheminNom[$1];
printf "Taille $?"; printf TailleFic[$1];
Mon code complet :
#!/bin/bash
echo ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Lancement' $0' (V25.RepDoubl.sh)
'
REP="/home/phil/ToutesSauvegardes/JournalSavTestSauvegarde/ActionDoublons.txt"
RepSource="/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine"
echo '$REP='"$REP"
echo '$RepSource'"$RepSource"
TailleFichier()
# 1Paramètre cheminFichier
{
echo $(wc -c $1)
return
}
# --------------------------------------------- INFO 5 Taille des fichiers à supprimer4 ---------------------------------------------------------
export -f TailleFichier
awk -v RepSource==\$RepSource 'BEGIN { print "\n ---------Début de Info5 Calcul taille des fichiers : "; FS=" § " }
{
if (/^\s*§+/) { next }
else
# printf ("la variable $1 est actuellement : ") $1;
{ NomRep[$1]=$1; NbRepDbl[$1]+=1; CheminNom[$1]=$1"/"$2; printf ("NomComplet >>>>>" CheminNom[$1] "<<<<<< NomRep " NomRep[$1] "--- Nbre Chps :" NF "---" $0" \n");
printf ("Taille de " CheminNom[$1] " :");
TailleFic[$1]=sprintf("wc -c %d", CheminNom[$1]);
printf TailleFichier CheminNom[$1];
TailleFichier CheminNom[$1];
printf "Taille $?"; printf TailleFic[$1];
print "\n";
"find \""NomRep[$1]"\" -maxdepth 1 ! -name \".*\" -type f | wc -l" | getline NbDblonRep[$1]};
print("RepsSourceVariable :"$RepSource, "NbRepDbl : " NbRepDbl[$1]);
}
END { print " terminé "}' "$REP"
Le resultat (bien que cela ne me semble pas trop utile ici):
phil@phil-G750JH:~/Documents/JeCodeShell/TestAWK$ ./Inf5.awk
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Lancement ./Inf5.awk (V25.RepDoubl.sh)
$REP=/home/phil/ToutesSauvegardes/JournalSavTestSauvegarde/ActionDoublons.txt
$RepSource/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine
---------Début de Info5 Calcul taille des fichiers :
NomComplet >>>>>Racine/Rep2.3DossierNormal/F2.3FichTexte1.txt<<<<<< NomRep Racine/Rep2.3DossierNormal--- Nbre Chps :2---Racine/Rep2.3DossierNormal § F2.3FichTexte1.txt
Taille de Racine/Rep2.3DossierNormal/F2.3FichTexte1.txt :Racine/Rep2.3DossierNormal/F2.3FichTexte1.txtTaille $?wc -c 0
RepsSourceVariable :Racine/Rep2.3DossierNormal § F2.3FichTexte1.txt NbRepDbl : 1
NomComplet >>>>>Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt<<<<<< NomRep Racine/REPORIAvecFichierPb--- Nbre Chps :2---Racine/REPORIAvecFichierPb § FOri2_FichTexte1.txt
Taille de Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt :Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txtTaille $?wc -c 0
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOri2_FichTexte1.txt NbRepDbl : 1
NomComplet >>>>>Racine/F2.CpBBID2_EspaceApresNef.nef <<<<<< NomRep Racine--- Nbre Chps :2---Racine § F2.CpBBID2_EspaceApresNef.nef
Taille de Racine/F2.CpBBID2_EspaceApresNef.nef :Racine/F2.CpBBID2_EspaceApresNef.nef Taille $?wc -c 0
RepsSourceVariable :Racine § F2.CpBBID2_EspaceApresNef.nef NbRepDbl : 1
NomComplet >>>>>Racine/Rep2.2 Espace Doublons /F2.2 CpBBID2_EspaceApresNef.nef <<<<<< NomRep Racine/Rep2.2 Espace Doublons --- Nbre Chps :2---Racine/Rep2.2 Espace Doublons § F2.2 CpBBID2_EspaceApresNef.nef
Taille de Racine/Rep2.2 Espace Doublons /F2.2 CpBBID2_EspaceApresNef.nef :Racine/Rep2.2 Espace Doublons /F2.2 CpBBID2_EspaceApresNef.nef Taille $?wc -c 0
RepsSourceVariable :Racine/Rep2.2 Espace Doublons § F2.2 CpBBID2_EspaceApresNef.nef NbRepDbl : 1
NomComplet >>>>>Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/F2.2.2.1 CpBBID2_EspaceApresNef.nef <<<<<< NomRep Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace--- Nbre Chps :2---Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1 CpBBID2_EspaceApresNef.nef
Taille de Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/F2.2.2.1 CpBBID2_EspaceApresNef.nef :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/F2.2.2.1 CpBBID2_EspaceApresNef.nef Taille $?wc -c 0
RepsSourceVariable :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1 CpBBID2_EspaceApresNef.nef NbRepDbl : 1
NomComplet >>>>>Racine/Rep2foisDblons/F2.X2.2.1 CpBBID2_EspaceApresNef.nef <<<<<< NomRep Racine/Rep2foisDblons--- Nbre Chps :2---Racine/Rep2foisDblons § F2.X2.2.1 CpBBID2_EspaceApresNef.nef
Taille de Racine/Rep2foisDblons/F2.X2.2.1 CpBBID2_EspaceApresNef.nef :Racine/Rep2foisDblons/F2.X2.2.1 CpBBID2_EspaceApresNef.nef Taille $?wc -c 0
RepsSourceVariable :Racine/Rep2foisDblons § F2.X2.2.1 CpBBID2_EspaceApresNef.nef NbRepDbl : 1
NomComplet >>>>>Racine/Rep2foisDblons/FOrig2.1 CpBBID2_EspaceApresNef.nef <<<<<< NomRep Racine/Rep2foisDblons--- Nbre Chps :2---Racine/Rep2foisDblons § FOrig2.1 CpBBID2_EspaceApresNef.nef
Taille de Racine/Rep2foisDblons/FOrig2.1 CpBBID2_EspaceApresNef.nef :Racine/Rep2foisDblons/FOrig2.1 CpBBID2_EspaceApresNef.nef Taille $?wc -c 0
RepsSourceVariable :Racine/Rep2foisDblons § FOrig2.1 CpBBID2_EspaceApresNef.nef NbRepDbl : 2
NomComplet >>>>>Racine/REPORIAvecFichierPb/FOrig2.1 CpBBID2_EspaceApresNef.nef <<<<<< NomRep Racine/REPORIAvecFichierPb--- Nbre Chps :2---Racine/REPORIAvecFichierPb § FOrig2.1 CpBBID2_EspaceApresNef.nef
Taille de Racine/REPORIAvecFichierPb/FOrig2.1 CpBBID2_EspaceApresNef.nef :Racine/REPORIAvecFichierPb/FOrig2.1 CpBBID2_EspaceApresNef.nef Taille $?wc -c 0
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOrig2.1 CpBBID2_EspaceApresNef.nef NbRepDbl : 2
NomComplet >>>>>Racine/F2BBID1_1 espaceApresJpg.jpg <<<<<< NomRep Racine--- Nbre Chps :2---Racine § F2BBID1_1 espaceApresJpg.jpg
Taille de Racine/F2BBID1_1 espaceApresJpg.jpg :Racine/F2BBID1_1 espaceApresJpg.jpg Taille $?wc -c 0
RepsSourceVariable :Racine § F2BBID1_1 espaceApresJpg.jpg NbRepDbl : 2
NomComplet >>>>>Racine/Rep2.2 Espace Doublons /F2.2BID1_1espaceApresJpg.jpg <<<<<< NomRep Racine/Rep2.2 Espace Doublons --- Nbre Chps :2---Racine/Rep2.2 Espace Doublons § F2.2BID1_1espaceApresJpg.jpg
Taille de Racine/Rep2.2 Espace Doublons /F2.2BID1_1espaceApresJpg.jpg :Racine/Rep2.2 Espace Doublons /F2.2BID1_1espaceApresJpg.jpg Taille $?wc -c 0
RepsSourceVariable :Racine/Rep2.2 Espace Doublons § F2.2BID1_1espaceApresJpg.jpg NbRepDbl : 2
NomComplet >>>>>Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/F2.2.2.1BBID1_1 espaceApresJpg.jpg <<<<<< NomRep Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace--- Nbre Chps :2---Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1BBID1_1 espaceApresJpg.jpg
Taille de Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/F2.2.2.1BBID1_1 espaceApresJpg.jpg :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/F2.2.2.1BBID1_1 espaceApresJpg.jpg Taille $?wc -c 0
RepsSourceVariable :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1BBID1_1 espaceApresJpg.jpg NbRepDbl : 2
NomComplet >>>>>Racine/Rep2foisDblons/F2.1X2_BBID1_1 espaceApresJpg.jpg <<<<<< NomRep Racine/Rep2foisDblons--- Nbre Chps :2---Racine/Rep2foisDblons § F2.1X2_BBID1_1 espaceApresJpg.jpg
Taille de Racine/Rep2foisDblons/F2.1X2_BBID1_1 espaceApresJpg.jpg :Racine/Rep2foisDblons/F2.1X2_BBID1_1 espaceApresJpg.jpg Taille $?wc -c 0
RepsSourceVariable :Racine/Rep2foisDblons § F2.1X2_BBID1_1 espaceApresJpg.jpg NbRepDbl : 3
NomComplet >>>>>Racine/Rep2foisDblons/FOri2.1BBID1_1 espaceApresJpg.jpg <<<<<< NomRep Racine/Rep2foisDblons--- Nbre Chps :2---Racine/Rep2foisDblons § FOri2.1BBID1_1 espaceApresJpg.jpg
Taille de Racine/Rep2foisDblons/FOri2.1BBID1_1 espaceApresJpg.jpg :Racine/Rep2foisDblons/FOri2.1BBID1_1 espaceApresJpg.jpg Taille $?wc -c 0
RepsSourceVariable :Racine/Rep2foisDblons § FOri2.1BBID1_1 espaceApresJpg.jpg NbRepDbl : 4
NomComplet >>>>>Racine/REPORIAvecFichierPb/FOri2.1BBID1_1 espaceApresJpg.jpg <<<<<< NomRep Racine/REPORIAvecFichierPb--- Nbre Chps :2---Racine/REPORIAvecFichierPb § FOri2.1BBID1_1 espaceApresJpg.jpg
Taille de Racine/REPORIAvecFichierPb/FOri2.1BBID1_1 espaceApresJpg.jpg :Racine/REPORIAvecFichierPb/FOri2.1BBID1_1 espaceApresJpg.jpg Taille $?wc -c 0
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOri2.1BBID1_1 espaceApresJpg.jpg NbRepDbl : 3
NomComplet >>>>>Racine/F2_F07 Fichier avec espaces.mp3<<<<<< NomRep Racine--- Nbre Chps :2---Racine § F2_F07 Fichier avec espaces.mp3
Taille de Racine/F2_F07 Fichier avec espaces.mp3 :Racine/F2_F07 Fichier avec espaces.mp3Taille $?wc -c 0
RepsSourceVariable :Racine § F2_F07 Fichier avec espaces.mp3 NbRepDbl : 3
NomComplet >>>>>Racine/Rep2.2 Espace Doublons /F2.2_F07 Fichier avec espaces.mp3<<<<<< NomRep Racine/Rep2.2 Espace Doublons --- Nbre Chps :2---Racine/Rep2.2 Espace Doublons § F2.2_F07 Fichier avec espaces.mp3
Taille de Racine/Rep2.2 Espace Doublons /F2.2_F07 Fichier avec espaces.mp3 :Racine/Rep2.2 Espace Doublons /F2.2_F07 Fichier avec espaces.mp3Taille $?wc -c 0
RepsSourceVariable :Racine/Rep2.2 Espace Doublons § F2.2_F07 Fichier avec espaces.mp3 NbRepDbl : 3
NomComplet >>>>>Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/F2.2.2.1_F07 Fichier avec espaces.mp3<<<<<< NomRep Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace--- Nbre Chps :2---Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1_F07 Fichier avec espaces.mp3
Taille de Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/F2.2.2.1_F07 Fichier avec espaces.mp3 :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/F2.2.2.1_F07 Fichier avec espaces.mp3Taille $?wc -c 0
RepsSourceVariable :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1_F07 Fichier avec espaces.mp3 NbRepDbl : 3
NomComplet >>>>>Racine/REPORIAvecFichierPb/FOri2.1_F07 Fichier avec espaces.mp3<<<<<< NomRep Racine/REPORIAvecFichierPb--- Nbre Chps :2---Racine/REPORIAvecFichierPb § FOri2.1_F07 Fichier avec espaces.mp3
Taille de Racine/REPORIAvecFichierPb/FOri2.1_F07 Fichier avec espaces.mp3 :Racine/REPORIAvecFichierPb/FOri2.1_F07 Fichier avec espaces.mp3Taille $?wc -c 0
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOri2.1_F07 Fichier avec espaces.mp3 NbRepDbl : 4
NomComplet >>>>>Racine/Rep2.2 Espace Doublons /FichierTxt3.txt<<<<<< NomRep Racine/Rep2.2 Espace Doublons --- Nbre Chps :2---Racine/Rep2.2 Espace Doublons § FichierTxt3.txt
Taille de Racine/Rep2.2 Espace Doublons /FichierTxt3.txt :Racine/Rep2.2 Espace Doublons /FichierTxt3.txtTaille $?wc -c 0
RepsSourceVariable :Racine/Rep2.2 Espace Doublons § FichierTxt3.txt NbRepDbl : 4
NomComplet >>>>>Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/FichierTxt3.txt<<<<<< NomRep Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace--- Nbre Chps :2---Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § FichierTxt3.txt
Taille de Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/FichierTxt3.txt :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace/FichierTxt3.txtTaille $?wc -c 0
RepsSourceVariable :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § FichierTxt3.txt NbRepDbl : 4
NomComplet >>>>>Racine/Rep2.3DossierNormal/FichierTxt3.txt<<<<<< NomRep Racine/Rep2.3DossierNormal--- Nbre Chps :2---Racine/Rep2.3DossierNormal § FichierTxt3.txt
Taille de Racine/Rep2.3DossierNormal/FichierTxt3.txt :Racine/Rep2.3DossierNormal/FichierTxt3.txtTaille $?wc -c 0
RepsSourceVariable :Racine/Rep2.3DossierNormal § FichierTxt3.txt NbRepDbl : 2
NomComplet >>>>>Racine/REPORIAvecFichierPb/FOri2_FichierTxt3.txt<<<<<< NomRep Racine/REPORIAvecFichierPb--- Nbre Chps :2---Racine/REPORIAvecFichierPb § FOri2_FichierTxt3.txt
Taille de Racine/REPORIAvecFichierPb/FOri2_FichierTxt3.txt :Racine/REPORIAvecFichierPb/FOri2_FichierTxt3.txtTaille $?wc -c 0
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOri2_FichierTxt3.txt NbRepDbl : 5
terminé
phil@phil-G750JH:~/Documents/JeCodeShell/TestAWK$
Merci
Hors ligne
#7 Le 01/05/2020, à 10:59
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
On l'avait fait pour la commande find dans des questions précédentes : il suffit de refaire la même chose pour wc -c.
Par exemple, pour afficher la taille du fichier CheminNom[$1] sur la sortie standard :
system("wc -c " CheminNom[$1])
Pour la récupérer dans la variable TailleFic[$1] :
"wc -c " CheminNom[$1] | getline TailleFic[$1]
Pour l'export de la fonction, tu peux le mettre où tu veux, entre la déclaration de cette fonction et l'appel au sous processus qui doit l'utiliser.
Et pour utiliser cette fonction dans awk, c'est pareil que pour toute autre commande, comme je disais plus haut* :
TailleFichier() {
…
}
…
export -f TailleFichier
…
awk '{
system("TailleFichier " variable_awk)
"TailleFichier " variable_awk_1 | getline variable_awk_2
}' fichier_entrée_awk
--
* Faux, sauf si sh pointe vers bash sur le système hôte : voir commentaire en #20.
Dernière modification par kamaris (Le 02/05/2020, à 16:28)
Hors ligne
#8 Le 01/05/2020, à 14:06
- philoeil
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour,
J'ai 2 commandes en réussite et 3 en echec
J'aimerai bien apprendre de mes echecs, j'échoue à appeler la fonction
Mes commandes echecs :
system("TailleFichier " CheminNom[$1]) | getline TailleFic3[$1];
"TailleFichier " CheminNom[$1] | getline TailleFic4[$1];
Essai avec Find
find $RepSource -name "*" -exec TailleFichier {} \;
LE code complet
#!/bin/bash
echo ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Lancement' $0' (V25.RepDoubl.sh)
'
#REP="/home/phil/ToutesSauvegardes/JournalSavTestSauvegarde/ActionDoublons.txt"
REP="/home/phil/Documents/JeCodeShell/TestAWK/MemActions/ActSimpl.txt"
RepSource="/home/phil/Documents/JeCodeShell/TestAWK/Racine"
#Les fichiers tests sont dans le chemin RepSource
echo '$REP='"$REP"
echo '$RepSource'"$RepSource"
TailleFichier()
# 1Paramètre cheminFichier
{
echo '$1='"$1"
echo $(`wc -c $1`)
echo $(wc -c $1)
return
}
# essai appel fonction simple
echo "Appel fonction simple";
echo " resultat methode Find";
find $RepSource -name "*" -exec TailleFichier {} \;
echo "Resultat methode mano"
TailleFichier "Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt"
Retour1=$?
echo $Retour1
echo "Appel simple terminé"
# --------------------------------------------- INFO 5 Taille des fichiers à supprimer4 ---------------------------------------------------------
export -f TailleFichier
awk -v RepSource==\$RepSource 'BEGIN { print "\n ---------Début de Info5 Calcul taille des fichiers : "; FS=" § " }
{
if (/^\s*§+/) { next }
else
# printf ("la variable $1 est actuellement : ") $1;
set -x
{ NomRep[$1]=$1; NbRepDbl[$1]+=1; CheminNom[$1]=$1"/"$2;
printf ("NomComplet >>>>>" CheminNom[$1] "<<<<<< NomRep " NomRep[$1] "--- Nbre Chps :" NF "---" $0" \n");
printf ("\nEssais de représentation de la taille de " CheminNom[$1] " :");
system("wc -c " CheminNom[$1]) | getline TailleFic1[$1];
"wc -c " CheminNom[$1] | getline TailleFic2[$1];
system ("TailleFichier " CheminNom[$1]) | getline TailleFic3[$1];
"TailleFichier " CheminNom[$1] | getline TailleFic4[$1];
set +x
printf ("TailleFic1[$1]=" TailleFic2[$1] " \nTailleFic2[$1]=" TailleFic2[$1] "\nTailleFic3[$1]=" TailleFic3[$2] "\nTailleFic4[$1]=" TailleFic4[$1] " \n");
"find \""NomRep[$1]"\" -maxdepth 1 ! -name \".*\" -type f | wc -l" | getline NbDblonRep[$1]};
print("RepsSourceVariable :"$RepSource, "NbRepDbl : " NbRepDbl[$1]);
}
END { print " terminé "}' "$REP"
LE resultat complet :
phil@phil-G750JH:~/Documents/JeCodeShell/TestAWK$ ./Inf5.2.sh
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Lancement ./Inf5.2.sh (V25.RepDoubl.sh)
$REP=/home/phil/Documents/JeCodeShell/TestAWK/MemActions/ActSimpl.txt
$RepSource/home/phil/Documents/JeCodeShell/TestAWK/Racine
Appel fonction simple
resultat methode Find
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
find: ‘TailleFichier’: Aucun fichier ou dossier de ce type
Resultat methode mano
$1=Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt
./Inf5.2.sh: ligne 17: 6037 : commande introuvable
6037 Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt
0
Appel simple terminé
---------Début de Info5 Calcul taille des fichiers :
NomComplet >>>>>Racine/Rep2.3DossierNormal/F2.3FichTexte1.txt<<<<<< NomRep Racine/Rep2.3DossierNormal--- Nbre Chps :2---Racine/Rep2.3DossierNormal § F2.3FichTexte1.txt
Essais de représentation de la taille de Racine/Rep2.3DossierNormal/F2.3FichTexte1.txt :6037 Racine/Rep2.3DossierNormal/F2.3FichTexte1.txt
sh: 1: 0: not found
sh: 1: TailleFichier: not found
sh: 1: 127: not found
sh: 1: TailleFichier: not found
TailleFic1[$1]=6037 Racine/Rep2.3DossierNormal/F2.3FichTexte1.txt
TailleFic2[$1]=6037 Racine/Rep2.3DossierNormal/F2.3FichTexte1.txt
TailleFic3[$1]=
TailleFic4[$1]=
RepsSourceVariable :Racine/Rep2.3DossierNormal § F2.3FichTexte1.txt NbRepDbl : 1
NomComplet >>>>>Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt<<<<<< NomRep Racine/REPORIAvecFichierPb--- Nbre Chps :2---Racine/REPORIAvecFichierPb § FOri2_FichTexte1.txt
Essais de représentation de la taille de Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt :6037 Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt
sh: 1: TailleFichier: not found
sh: 1: TailleFichier: not found
TailleFic1[$1]=6037 Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt
TailleFic2[$1]=6037 Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt
TailleFic3[$1]=
TailleFic4[$1]=
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOri2_FichTexte1.txt NbRepDbl : 1
terminé
phil@phil-G750JH:~/Documents/JeCodeShell/TestAWK$
Au plaisir de lire tes conseils
Merci
Hors ligne
#9 Le 01/05/2020, à 14:19
- LeoMajor
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
bonjour,
autant utiliser les fonctions sous awk ...
"find" à l'intérieur d'un awk est maladroit.
1/ solution rapide pour les doublons; detox + fdupes
2/ a/ detox pour nettoyer les fichiers (espaces, caractères exotiques, ....)
detox -r ~/Images
touch "/tmp/le Père Nöel (2020):父のクリスマス"
detox "/tmp/le Père Nöel (2020): 父のクリスマス"
--> renvoie /tmp/le_Pere_Noel-2020-
b/ simuler fdupes sous awk
à adapter
:~$ cat ~/scripts/afdupes.awk
#!/bin/gawk
func excludedirname() {
for (i=1;i<ARGC;i++)
{if ( (getline line < ARGV[i]) <= 0 )
{ #print "exclus:", ARGV[i], ERRNO;
delete ARGV[i] }
close(ARGV[i]) }
}
func real(f) { cmd="realpath " f; cmd|getline tmp; close(cmd); return tmp }
func md5(f) { cmd="md5sum " f; cmd|getline tmp; close(cmd); return tmp }
func affichage(array){
PROCINFO["sorted_in"] = "@ind_num_asc"
for (i in array)
if(!(i~/files\.nb/)&&(array[i]["count"]>1)){id++; print "\n",id,"---"
for (j in array[i])
print "+", j, array[i][j]
}
}
func doublons(array){
PROCINFO["sorted_in"] = "@ind_num_asc"
for (i in array)
if(!(i~/files\.nb/)&&(array[i]["count"]>1)){id++; print "\n",id,"---"
for (j in array[i]){
if(j~/count|hash/)print j,array[i][j]
else if(j==1)print "à garder", j, array[i][j]
else if(j>1){print "à supprimer",j,array[i][j]
#print del(array[i][j])
}
}
}
}
func rdoublons(array, nokeep, keep){
#nokeep, keep: regex
PROCINFO["sorted_in"] = "@ind_num_asc"
for (i in array)
if(!(i~/files\.nb/)&&(array[i]["count"]>1)){id++; print "\n",id,"---"
for (j in array[i]){
if(j~/count|hash/)print j,array[i][j]
else if(array[i][j]~nokeep){print "à supprimer", j, array[i][j]
#print del(array[i][j])
}
else if(array[i][j]~keep){print "à garder",j,array[i][j]
}
}
}
}
func del(f) { cmd=system("rm " f); if(cmd==0){res="supression"}else{res="erreur rm"}; return f" "res }
BEGIN { excludedirname() }
BEGINFILE {
if(FILENAME) {
nb++
nf=split(md5(FILENAME),t," ")
m=t[1]
c[m]++
fs[m]["hash"]=m
fs[m]["count"]=c[m]
fs[m][c[m]]=real(t[2])
fs["files.nb"][""]=nb
#print fs[m]["count"],fs[m][c[m]],fs[m]["hash"]
}
}
END {
affichage(fs)
# simple affichage
doublons(fs)
# le 1er est gardé, les autres détruits
rdoublons(fs, ".*[Cc]opie.*", ".*")
# supprime les doublons ".*[Cc]opie.*", le reste des doublons est gardé
print "\n","nombre de fichiers scannés:", fs["files.nb"][""]
}
usage, par exemple
shopt -s globstar
#simule la récursivité
gawk -f ~/scripts/afdupes.awk ~/Documents/** > /tmp/a.log
Hors ligne
#10 Le 01/05/2020, à 15:01
- philoeil
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour,
Merci LEoMajor
1/ solution rapide pour les doublons; detox + fdupes
Oui mais c'est volontairement que je n'utilise pas cette solution
Je cherche à comprendre de mes erreurs pour apprendre, uniquement
et avancer dans un projet perso
Hors ligne
#11 Le 01/05/2020, à 15:51
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
@philoeil, #8 : désolé, mais là, tu mélanges tout, donc je ne vais pas reprendre une à une toutes les erreurs.
En premier lieu, comme je te l'ai dit dans un précédent sujet, tu devrais travailler avec des cas de test strictement élémentaires : une chose à comprendre, un cas de test.
Ensuite, à chaque ligne de code, tu devrais te demander : est-ce que ce que j'écris a un sens ? si oui, lequel ?
Par exemple : quel est le sens de
system("TailleFichier " CheminNom[$1]) | getline TailleFic3[$1];
Ou encore, quel est le sens de set -x dans un programme awk ?
Hors ligne
#12 Le 01/05/2020, à 17:24
- philoeil
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour,
Merci Kamaris
OK : Je me recentre et j’arrête de partir dans tous les sens (en plus je n'ai plus vraiment le temps)
Je n'ai pas compris comment appeler 1 fonction depuis AWK mais
Une des solutions fonctionne c'est l'essentiel.
# --------------------------------------------- INFO 5 Taille des fichiers à supprimer4 ---------------------------------------------------------
echo '$RepSource='$RepSource
awk -v RepSource==\$RepSource 'BEGIN { print "\n ---------Début de Info5 Calcul taille des fichiers : "; FS=" § " }
{
if (/^\s*§+/) { next }
else
# printf ("la variable $1 est actuellement : ") $1;
{ NomRep[$1]=$1;
"find \""NomRep[$1]"\" -name "$2" | wc -c" | getline TailleFic5[$1];
printf ("\nRepsSourceVariable :" $RepSource "Taille :" TailleFic5[$1]);
TotalTaille=TailleFic5[$1]+TotalTaille
}
}
END { print " terminé Total " TotalTaille }' "$REP"
une chose à comprendre, un cas de test.
Je cherche maintenant à comparer la somme de la taille obtenue avec l'espace libre sur le disque dur pour m'avertir si problème en vu .
(Pour mes tests je préfère déplacer dans 1 dossier poubelle)
Avez-vous une idée de comment on s'y prend ?
Merci encore à toutes les bonnes volontés
Hors ligne
#13 Le 01/05/2020, à 18:20
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Non, ce que tu as là ne fonctionne pas.
wc -c calcule la taille du nom du fichier, pas du fichier lui-même (as-tu testé la commande dans un terminal avant de la mettre dans awk ?)
Il faut utiliser l'option -exec de find.
Hors ligne
#14 Le 01/05/2020, à 18:37
- philoeil
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour,
Merci Kamaris
"find \""NomRep[$1]"\" -name "$2" -exec bash -c \""TailleFichier {} "\"" | getline TailleFic5[$1];
Me donne en erreur
awk: ligne de commande:11: "find \""NomRep[$1]"\" -name "$2" -exec bash -c \""TailleFichier {}"\"" | getline TailleFic5[$1];
awk: ligne de commande:11: ^ syntax error
J'ai essayé plusieurs variantes sans succès
Une idée ?
Merci
Hors ligne
#15 Le 01/05/2020, à 18:41
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Teste d'abord la commande dans un terminal avant de la mettre dans awk.
Hors ligne
#16 Le 02/05/2020, à 07:56
- philoeil
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour,
Merci Kamaris
Mon retour la commande "Find direct"
echo " resultat methode Find";
find $RepSource -name "*.txt" -exec bash -c "TailleFichier {}" \;
Le resultat :
phil@phil-G750JH:~/Documents/JeCodeShell/TestAWK$ ./Inf5.3.sh
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Lancement ./Inf5.3.sh (V25.RepDoubl.sh)
$REP=/home/phil/Documents/JeCodeShell/TestAWK/MemActions/ActSimpl.txt
$RepSource/home/phil/Documents/JeCodeShell/TestAWK/Racine
Appel fonction simple------------------------------------------------------------------------
resultat methode Find
$1=/home/phil/Documents/JeCodeShell/TestAWK/Racine/REPORIAvecFichierPb/FOri2_FichierTxt3.txt
17 /home/phil/Documents/JeCodeShell/TestAWK/Racine/REPORIAvecFichierPb/FOri2_FichierTxt3.txt
$1=/home/phil/Documents/JeCodeShell/TestAWK/Racine/REPORIAvecFichierPb/FORi2_Fichiertxt2.txt
17 /home/phil/Documents/JeCodeShell/TestAWK/Racine/REPORIAvecFichierPb/FORi2_Fichiertxt2.txt
$1=/home/phil/Documents/JeCodeShell/TestAWK/Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt
6037 /home/phil/Documents/JeCodeShell/TestAWK/Racine/REPORIAvecFichierPb/FOri2_FichTexte1.txt
$1=/home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.2
wc: /home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.2: Aucun fichier ou dossier de ce type
$1=/home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.2
wc: /home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.2: Aucun fichier ou dossier de ce type
$1=/home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.3DossierNormal/F2.3FichTexte1.txt
6037 /home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.3DossierNormal/F2.3FichTexte1.txt
$1=/home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.3DossierNormal/FichierTxt3.txt
17 /home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.3DossierNormal/FichierTxt3.txt
$1=/home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.3DossierNormal/F2.3Textenomal.txt
13 /home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.3DossierNormal/F2.3Textenomal.txt
Cela me semble correct
Mais je n'arrive pas à corriger mon code post #14
Un peu d'aide ?
Merci
Hors ligne
#17 Le 02/05/2020, à 09:11
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Ça n'est pas correct :
- wc renvoie des messages d'erreur ;
- que se passera-t-il si les noms de fichier contiennent des espaces (ne serait-ce pas lié au point précédent) ?
- pourquoi utiliser bash -c (ne serait-ce pas lié aux points précédents) ?
- que se passera-t-il si $RepSource contient des espaces ?
Hors ligne
#18 Le 02/05/2020, à 10:43
- philoeil
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour,
Kamaris
Cette partie du code est focalisée sur mesure de la taille des fichiers à (déplacer dans une poubelle temporaire) et à comparer avec la capacité restante du disque cible.
Les fichiers et repertoires sont traités correctement avec ou sans espace dans les parties du code AWK.
Les erreurs identifiées wc me semblent sans importances
- pourquoi utiliser bash -c (ne serait-ce pas lié aux points précédents) ?
La je ne sais pas je l'ai lu dans un post de Kamaris en 2007, il n'expliquait pas pourquoi ...:P
Trefle de plaisanterie comme dirait un lapin dans un carré de Luzernes ! (citation que les moins de 20 ans ne peuvent pas connaitre: F.R.)
J’essaie d'apprendre le Shell mais je suis très loin de ton expérience...
Tu sembles sous entendre que bash ne s'emploie pas dans AWK ...
à creuser
Mais j'ai étais incapable d'appeler la fonction depuis AWK et je cherche....encore.... (post#8)
Merci
Hors ligne
#19 Le 02/05/2020, à 11:30
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Les erreurs identifiées wc me semblent sans importances
Tu te trompes : find -name "*.txt" ne peut renvoyer que des noms se terminant par .txt.
Par quelle magie wc pourrait-il récupérer un nom ne se terminant pas par .txt :
wc: /home/phil/Documents/JeCodeShell/TestAWK/Racine/Rep2.2: Aucun fichier ou dossier de ce type
C'est qu'une partie du nom a été perdue en cour de route, pour une raison ou une autre, et je pencherais plutôt pour le mauvais traitement des espaces.
Tu sembles sous entendre que bash ne s'emploie pas dans AWK ...
Non, je t'ai justement fait sortir temporairement de awk pour tenter de circonscrire les problèmes, afin d'avancer étape par étape.
Pour l'instant, on essaie de construire une commande find correcte, qui fait ce que l'on veut dans un terminal, avant de la mettre dans awk.
Je suis désolé, mais tu dois faire cet effort de méthode si tu veux avancer : prendre le manuel de find, voir comment s'utilise l'option -exec, et construire une commande find où ne figurent que des choses dont tu sais pourquoi elles sont là, et ce qu'elles font exactement.
Mais j'ai étais incapable d'appeler la fonction depuis AWK et je cherche....encore.... (post#8)
Tu veux aller trop vite et faire des choses trop (et inutilement) compliquées, alors que tu ne maitrises pas ce qui précède : pour ma part, je refuse de te donner des solutions toutes faites dans ces conditions.
Je le répète, je suis désolé, car je ne souhaite pas te vexer, ni encore moins te prendre de haut ou quoi que ce soit de ce genre.
Mais j'ai essayé précédemment la méthode des explications détaillées accompagnant du code propre pour répondre à tes questions, et ça n'a pas été concluant, donc je change de méthode.
Hors ligne
#20 Le 02/05/2020, à 16:21
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Je me rends compte d'une subtilité qui me joue souvent des tours, car je ne suis pas sous ubuntu, où la commande sh appelle le shell dash, et non pas bash.
Or, lorsque awk exécute une commande externe, il le fait dans un shell qu'il appelle par sh.
Si maintenant la commande en question est une fonction bash, on aura beau l'exporter, sh qui pointe vers dash ne la verra pas, car l'export de fonctions est propre à bash.
D'où l'erreur que tu obtenais en #8 :
sh: 1: TailleFichier: not found
Je ne sais pas s'il est possible (sans modifier les liens symboliques du système) d'imposer à awk un shell spécifique lors d'un appel à system() ou getline().
Mais de toutes façons, il faut plutôt voir là une incitation à faire autrement : l'appel de fonctions shell depuis awk ne devrait pas avoir lieu, c'est le signe d'un problème de conception en amont.
Par ailleurs, on a déjà vu en #2 que ta fonction TailleFichier était inutile, c'est pourquoi l'utilisation de bash -c dans find l'est également : tu devrais appeler directement wc -c.
Dernière modification par kamaris (Le 02/05/2020, à 16:22)
Hors ligne
#21 Le 02/05/2020, à 17:33
- philoeil
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour,
Merci Kamaris Je suis Fan de tes explications qui m’apprennent toujours plein de choses et me font réfléchir.
J'ai donc Cogita retractare solve (revu, réfléchi Resolu)
Mais de toutes façons, il faut plutôt voir là une incitation à faire autrement : l'appel de fonctions shell depuis awk ne devrait pas avoir lieu, c'est le signe d'un problème de conception en amont.
Tout à fait juste :
Je me suis aperçu que je pouvais plus facilement obtenir la taille des fichiers simplement en rajoutant 1 champs taille à ma premiere extraction qui récupère les doublons.
Donc c’est résolu.
Pour information et revenir sur le code de résolution du problème
dans 1 partie 1 j’ai rajouté Size que je récupère plus loin dans le champs 3
find "$REP" -name "[^.]*" -type f -size +"$TailleMo"M -printf "%h*%f*%s* %c* dernier accès le %AA %Ad %AB %AY à %AH:%AM:%AS* " -exec /usr/bin/md5sum -b {} \;| sort -n -t ";" -k 6,2 > "$CheminActionDbl/$FILE2"
while read file2; do
DOUBLON2=1
echo "§§§§§§ Empreinte MD5 identique pour : $file2 des fichiers suivants :" 2>&1 | tee -a "$CheminActionDbl/ActionDoublons.txt"
grep $file2 "$CheminActionDbl"/"$FILE2" | cut -d'*' -f 1,2,3 | sed -e "s/*/ § /g" 2>&1 | tee -a "$CheminActionDbl/ActionDoublons.txt"
done <"$CheminActionDbl/FILE3"
Le champs 3 etant l’info size
Que je récupère ici en colonne 3
§§§§§§ Empreinte MD5 identique pour : 0cbbff1c0f1c5bdc5ce8e2b8f483e560 des fichiers suivants :
Racine/Rep2.3DossierNormal § F2.3FichTexte1.txt § 6037
Racine/REPORIAvecFichierPb § FOri2_FichTexte1.txt § 6037
§§§§§§ Empreinte MD5 identique pour : 10a6ada757ec577d3a3db0654dd60a45 des fichiers suivants :
Racine § F2.CpBBID2_EspaceApresNef.nef § 27409633
Racine/Rep2.2 Espace Doublons § F2.2 CpBBID2_EspaceApresNef.nef § 27409633
Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1 CpBBID2_EspaceApresNef.nef § 27409633
Racine/Rep2foisDblons § F2.X2.2.1 CpBBID2_EspaceApresNef.nef § 27409633
Racine/Rep2foisDblons § FOrig2.1 CpBBID2_EspaceApresNef.nef § 27409633
Racine/REPORIAvecFichierPb § FOrig2.1 CpBBID2_EspaceApresNef.nef § 27409633
§§§§§§ Empreinte MD5 identique pour : 93243bbb48aa8de88968bee06e6c8c9b des fichiers suivants :
Racine § F2BBID1_1 espaceApresJpg.jpg § 13757937
Racine/Rep2.2 Espace Doublons § F2.2BID1_1espaceApresJpg.jpg § 13757937
Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1BBID1_1 espaceApresJpg.jpg § 13757937
Racine/Rep2foisDblons § F2.1X2_BBID1_1 espaceApresJpg.jpg § 13757937
Racine/Rep2foisDblons § FOri2.1BBID1_1 espaceApresJpg.jpg § 13757937
Racine/REPORIAvecFichierPb § FOri2.1BBID1_1 espaceApresJpg.jpg § 13757937
§§§§§§ Empreinte MD5 identique pour : d3fad710647642c327aceeec1b773a71 des fichiers suivants :
Racine § F2_F07 Fichier avec espaces.mp3 § 6849810
Racine/Rep2.2 Espace Doublons § F2.2_F07 Fichier avec espaces.mp3 § 6849810
Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1_F07 Fichier avec espaces.mp3 § 6849810
Racine/REPORIAvecFichierPb § FOri2.1_F07 Fichier avec espaces.mp3 § 6849810
§§§§§§ Empreinte MD5 identique pour : f6638c0e380e1a9a89b026c2f33600f9 des fichiers suivants :
Racine/Rep2.2 Espace Doublons § FichierTxt3.txt § 17
Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § FichierTxt3.txt § 17
Racine/Rep2.3DossierNormal § FichierTxt3.txt § 17
Racine/REPORIAvecFichierPb § FOri2_FichierTxt3.txt § 17
LE code de l’étape 5 modifié qui en découle :
# --------------------------------------------- INFO 5 Taille des fichiers à supprimer4 ---------------------------------------------------------
awk 'BEGIN { print "\n ---------Début de Info5 Calcul taille des fichiers : "; FS=" § " }
{
if (/^\s*§+/) { next }
else
# printf ("la variable $3 taille est actuellement : ") $3;
{ NomRep[$1]=$1; TailleFic5[$1]=$3
printf ("\nRepsSourceVariable :" $RepSource "Taille :"$3);
TotalTaille=TailleFic5[$1]+TotalTaille
}
}
END { print "\n terminé Total " TotalTaille }' "$REP"
Le resultat :
phil@phil-G750JH:~/Documents/JeCodeShell/TestAWK$ ./Inf5.5.sh
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Lancement ./Inf5.5.sh (V25.RepDoubl.sh)
$REP=/home/phil/Documents/JeCodeShell/TestAWK/MemActions/ActionDoublons.txt
$RepSource/home/phil/Documents/JeCodeShell/TestAWK/Racine
---------Début de Info5 Calcul taille des fichiers :
RepsSourceVariable :Racine/Rep2.3DossierNormal § F2.3FichTexte1.txt § 6037Taille :6037
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOri2_FichTexte1.txt § 6037Taille :6037
RepsSourceVariable :Racine § F2.CpBBID2_EspaceApresNef.nef § 27409633Taille :27409633
RepsSourceVariable :Racine/Rep2.2 Espace Doublons § F2.2 CpBBID2_EspaceApresNef.nef § 27409633Taille :27409633
RepsSourceVariable :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1 CpBBID2_EspaceApresNef.nef § 27409633Taille :27409633
RepsSourceVariable :Racine/Rep2foisDblons § F2.X2.2.1 CpBBID2_EspaceApresNef.nef § 27409633Taille :27409633
RepsSourceVariable :Racine/Rep2foisDblons § FOrig2.1 CpBBID2_EspaceApresNef.nef § 27409633Taille :27409633
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOrig2.1 CpBBID2_EspaceApresNef.nef § 27409633Taille :27409633
RepsSourceVariable :Racine § F2BBID1_1 espaceApresJpg.jpg § 13757937Taille :13757937
RepsSourceVariable :Racine/Rep2.2 Espace Doublons § F2.2BID1_1espaceApresJpg.jpg § 13757937Taille :13757937
RepsSourceVariable :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1BBID1_1 espaceApresJpg.jpg § 13757937Taille :13757937
RepsSourceVariable :Racine/Rep2foisDblons § F2.1X2_BBID1_1 espaceApresJpg.jpg § 13757937Taille :13757937
RepsSourceVariable :Racine/Rep2foisDblons § FOri2.1BBID1_1 espaceApresJpg.jpg § 13757937Taille :13757937
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOri2.1BBID1_1 espaceApresJpg.jpg § 13757937Taille :13757937
RepsSourceVariable :Racine § F2_F07 Fichier avec espaces.mp3 § 6849810Taille :6849810
RepsSourceVariable :Racine/Rep2.2 Espace Doublons § F2.2_F07 Fichier avec espaces.mp3 § 6849810Taille :6849810
RepsSourceVariable :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1_F07 Fichier avec espaces.mp3 § 6849810Taille :6849810
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOri2.1_F07 Fichier avec espaces.mp3 § 6849810Taille :6849810
RepsSourceVariable :Racine/Rep2.2 Espace Doublons § FichierTxt3.txt § 17Taille :17
RepsSourceVariable :Racine/Rep2.2 Espace Doublons /Rep2.2.2.1 Doss Espace § FichierTxt3.txt § 17Taille :17
RepsSourceVariable :Racine/Rep2.3DossierNormal § FichierTxt3.txt § 17Taille :17
RepsSourceVariable :Racine/REPORIAvecFichierPb § FOri2_FichierTxt3.txt § 17Taille :17
terminé Total 274416802
phil@phil-G750JH:~/Documents/JeCodeShell/TestAWK$
Merci,
J'espère ne pas être trop long ... en même temps cela m'aide à me recentrer et prendre des notes..
Dernière modification par philoeil (Le 02/05/2020, à 17:41)
Hors ligne
#22 Le 02/05/2020, à 18:24
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Il y a eu un bel assainissement
Plus d'appel à des commandes externes depuis awk, une bonne commande find en amont, qui utilise le %s de printf au lieu d'appeler wc -c…
Je ne vois juste pas trop ce que fait le sort -n -t ";" -k 6,2 : j'imagine qu'il doit y avoir des ; dans tes noms de fichiers ?
Juste quelques remarques sur le code bash sinon :
pour une lecture sûre des lignes de "$CheminActionDbl/FILE3" :
while IFS='' read -r file2; do
pour un grep sûr avec $file2 comme motif ensuite :
grep -F "$file2" …
à quoi sert le DOUBLON2=1 au-dessus ?
Hors ligne
#23 Le 03/05/2020, à 18:42
- philoeil
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour,
Je te remercie, je ne maitrisais pas assez le code shell pour repérer ces erreurs.
Je ne vois juste pas trop ce que fait le sort -n -t ";" -k 6,2 : j'imagine qu'il doit y avoir des ; dans tes noms de fichiers ?
Oups ! Bien vu des * sont utilisés comme séparateurs de champs et plus des points virgules
et -k 6,2 c’est n’importe quoi !
J’ai corrigé
find "$REP" -name "[^.]*" -type f -size +"$TailleMo"M -printf "%h*%f*%s* %c* dernier accès le %AA %Ad %AB %AY à %AH:%AM:%AS* " -exec /usr/bin/md5sum -b {} \;| sort -n -t "*" -k 6,6 -n > "$CheminActionDbl/$FILE2"
pour une lecture sûre des lignes de "$CheminActionDbl/FILE3" :
while IFS='' read -r file2; do
• pour un grep sûr avec $file2 comme motif ensuite :
grep -F "$file2" …
Je corrige
while IFS='' read -r file2; do
DOUBLON2=1
echo "§§§§§§ Empreinte MD5 identique pour : $file2 des fichiers suivants :" 2>&1 | tee -a "$CheminActionDbl/ActionDoublons.txt"
grep -F $file2 "$CheminActionDbl"/"$FILE2" | cut -d'*' -f 1,2,3 | sed -e "s/*/ § /g" 2>&1 | tee -a "$CheminActionDbl/ActionDoublons.txt"
done <"$CheminActionDbl/FILE3"
if [ "$DOUBLON2" -eq 0 ]
then echo "Aucun doublon trouvé"
exit 1
#ajout d'un contrôle presence de repertoires avec 100% de doublon
else
echo "******************************************************************************
Des doublons trouvés lancement de ScriptRepDoublons (anciennement V25...5RepDoubl.sh) pour générer un fichier qui repérera les répertoires contenant 100% de doublons.
Une part des CPCent n'en sont pas quand les doublons sont dans le même chemin
**********************************************************************************************"
cp -v "$CheminActionDbl/ActionDoublons.txt" "$RepSource/"ActionDoublons.txt
echo "copie $CheminActionDbl/ActionDoublons.txt vers $RepSource/ActionDoublons.txt"
RepDoublons=$(awk 'BEGIN { FS=";" }
$1=="#NomDesProgrammes.sh" { print $4 }
END {} ' $chemin/configAspi.txt)
echo '$RepDoublons='"$RepDoublons"
"$chemin/$ScriptRepDoublons" "$CheminActionDbl""/ActionDoublons.txt" "$RepSource"
fi
à quoi sert le DOUBLON2=1 au-dessus ?
Objectif de cette partie
Si DOUBLONS2=0 in n’y a pas de doublons détectés
Si présence de doublons DOUBLONS2 passe à 1
(Il y avait sans doute mieux mais c’est tout ce que j’avais en tête )
Merci
Hors ligne
#24 Le 04/05/2020, à 00:58
- kamaris
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Pour le sort, je ne suis pas sûr que ça fasse bien ce que tu veux.
Si j'ai bien suivi, il s'applique au md5sum, donc à une suite de 16 octets codés en hexadécimal.
Il me semble donc qu'un simple tri alphanumérique caractère par caractère ferait l'affaire : sort -t "*" -k 6.
Attention pour le grep, à bien mettre des guillemets autour du motif $file2, car si jamais il contient des espaces, grep va être perdu : grep -F "$file2" …
Pour le DOUBLON2=1, c'est une possibilité oui, c'est juste que ça fait bizarre de répéter l'affectation de variable autant de fois qu'il y a de lignes dans "$CheminActionDbl/FILE3".
Tu pourrais le sortir de la boucle while en mettant un test avant :
test -s "$CheminActionDbl/FILE3" && DOUBLON2=1
Mais en l'occurrence, tu ne sembles pas te servir de $DOUBLON2 ailleurs que dans le test qui suit la boucle while.
Si tel est bien le cas, il pourrait être supprimé :
if ! [ -s "$CheminActionDbl/FILE3" ]; then
echo "Aucun doublon trouvé"
exit 1
else
while IFS='' read -r file2; do
echo "§§§§§§ Empreinte MD5 identique pour : $file2 des fichiers suivants :" 2>&1 | tee -a "$CheminActionDbl/ActionDoublons.txt"
grep -F "$file2" "$CheminActionDbl"/"$FILE2" | cut -d'*' -f 1,2,3 | sed -e "s/*/ § /g" 2>&1 | tee -a "$CheminActionDbl/ActionDoublons.txt"
done <"$CheminActionDbl/FILE3"
echo "******************************************************************************
Des doublons trouvés lancement de ScriptRepDoublons (anciennement V25...5RepDoubl.sh) pour générer un fichier qui repérera les répertoires contenant 100% de doublons.
…
fi
Hors ligne
#25 Le 04/05/2020, à 10:01
- philoeil
Re : [RESOLU] AWK comment recuperer (ou pas) le retour d'une fonction
Bonjour,
Merci Kamaris pour ton aide,
Pour le sort, je ne suis pas sûr que ça fasse bien ce que tu veux.
Si j'ai bien suivi, il s'applique au md5sum, donc à une suite de 16 octets codés en hexadécimal.
Il me semble donc qu'un simple tri alphanumérique caractère par caractère ferait l'affaire : sort -t "*" -k 6.
Tu as raison, je corrige
De plus Je n’avais pas bien compris la syntaxe je croyais qu’il fallait faire -k 6,6 (Le second 6 donnant le type (numérique, alphanum, etc...)
Attention pour le grep, à bien mettre des guillemets autour du motif $file2, car si jamais il contient des espaces, grep va être perdu : grep -F "$file2" …
Bien vu (je le savais et c’est une erreur)
Pour le DOUBLON2=1, c'est une possibilité oui, c'est juste que ça fait bizarre de répéter l'affectation de variable autant de fois qu'il y a de lignes dans "$CheminActionDbl/FILE3".
Tu pourrais le sortir de la boucle while ….tu ne sembles pas te servir de $DOUBLON2 ailleurs que dans le test qui suit la boucle while.
Si tel est bien le cas, il pourrait être supprimé :
100 fois bien vu
Je corrige
Je ferai le test avant, c'est bien plus performant
Je me disais « existe-t-il quelque part dans le web un « bac à sable » pour codeurs débutants qui permettrai à tout un chacun « débutant » d’exposer son code projet, quasi terminé, et imparfait à l’œil des programmeurs avertis.
Il pourrait en ressortir un best off bêtisier pour rigoler et apprendre,
mais surtout tout le monde en profiterait
Pour les programmeurs aguerris :des idées besoins en développement
Pour les plus faibles : renfort des apprentissages
Au plaisir de te lire
Hors ligne