IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

calcul de pourcentage


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Par défaut calcul de pourcentage
    Bonjour,
    je reviens sur un de mes problèmes, je doit calculer un pourcentage en fonction de la taille d'un répertoire en fonction d'un limite (500M), voici ma fonction :

    Avec ce premier je récupère la taille du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    taille=$(du -sh $folder| cut -f1  |awk '{print $1}' | sed 's/[a-zA-Z]//g')
    Ensuite avec cette fonction je la convertie en pourcentage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    percent=$(echo "scale=2;(($taille / 500) * 100)" | bc )
    Le problème c'est que ça ne marche pas si j'ai un répertoire qui fait 1,6M alors qu'un répertoire qui à une taille de 48M ça marche bien.

    Voila l'erreur qu'il me retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (standard_in) 1: syntax error
    merci d'avance pour l'aide !

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    c'est parce qu'il faut remplacer la virgule par un point !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    size=$(du -sh $folder | cut -f1 | sed 's/[a-zA-Z]//g; s/,/./')
    echo "scale=2; ($size/500)*100" | bc
    1.00
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    La première partie est encore optimisable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (
      LANG="C";
      du -sh $folder | echo "scale=2; $(awk -F '[[:alpha:]]' '{print $1}') * 100 / 500" | bc
    )
    En effet, passer ',' en '.' est dû à la langue ($LANG vaut surement fr_FR.utf-8). Donc on repasse LANG à sa valeur originelle: C, mais juste pour le calcul entre parenthèses (sous-shell). Et plutôt que de faire un cut puis un sed, awk fait le tout en une seule passe. Il y a quelques subtilités sur le passage des paramètres d'une commande à l'autre, mais c'est correct...

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    bien vu, jmelyn !

    aussi :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "scale=2; $(LC_NUMERIC=C du -sh $folder | sed 's/\([^a-Z]*\).*/\1/') * 100 / 500" | bc
    ou encore :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    taille=$(LC_NUMERIC=C du -sh $folder)
    echo "scale=2; ${taille%%[a-Z]*} * 100 / 500" |*bc
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    C'est joli aussi, N_BaH, mais une erreur s'est glissée dans le code: Chez oim, [^a-Z] n'est pas accepté comme expression régulière. Il faut [^a-zA-Z], ou mieux [^[:alpha:]].

    Je préfère trouver la variable taille en une seule étape. Donc avec sed ou awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    taille=$(LC_NUMERIC=C; du -sh $folder | awk '{print "%d\n", $1'})
    taille=$(LC_NUMERIC=C; du -sh $folder | sed 's/\(^[0-9]*\).*/\1/')
    Pour n'avoir plus qu'à faire ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "scale=2; $taille * 100 / 500" | bc
    On commence à avoir du code simple et clair à deux .

Discussions similaires

  1. Calcul de pourcentages
    Par Lypertrophie dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 30/06/2006, 11h25
  2. Reqête avec un calcul de pourcentage
    Par jean-pierre96 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2006, 13h00
  3. Réponses: 1
    Dernier message: 10/01/2006, 20h35
  4. calcul de pourcentage
    Par PAUL87 dans le forum Access
    Réponses: 12
    Dernier message: 20/09/2005, 19h50
  5. Calcul de pourcentage
    Par megazen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/11/2003, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo