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 :

Comptage de dossier et calcul de moyenne


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 7
    Par défaut Comptage de dossier et calcul de moyenne
    Salut à tous,

    Je débute sur les commandes bash et les scripts shell, c'est pourquoi je fait des sujets de TP que j'ai trouver sur le net. N'ayant pas les corrections, je suis bloqué sur 3 programmes.

    Il faut écrire un programme nommé nbDir en shell qui calcule et imprime sur la sortie standard le nombre de répertoires d’un répertoire passé en paramètre sans utiliser d’option particulière du ls.

    j'ai donc essayer avec le find :

    find ~/Bureau -type d | wc -l

    Mais cette commande compte aussi le nombre de sous-dossiers dans les dossiers.
    (pour info j'ai mis ~/Bureau pour tester ce répertoire, néanmoins la demande est de tester le dossier mis en paramètre)

    Concernant le calcul de la moyenne, je suis à sec...

    – Ecrire le script Shell moyenne qui calcule la moyenne des nombres passés en paramètre.
    – Ecrire le script Shell moyenne qui calcule la moyenne des nombres contenu dans un fichier dont le nom est passé
    en paramètre.

    Merci d'avance de toutes vos réponses.

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Avril 2009
    Messages : 26
    Par défaut
    Bonjour sleepers56,

    Pour ton premier programme, tu peux utiliser file
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file $1/* | grep directory | wc -l

  3. #3
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Tu peux bien sûr limiter la profondeur de la recherche de find :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type d -maxdepth 1 | wc -l
    (Tu remarqueras que . est listé par find et donc comptabilisé comme un répertoire).

    Tu peux aussi lister les répertoires, un par ligne, avec ls, en limitant l'affichage à ceux qui finissent par / :Zsh permet de filtrer entre répertoires et fichiers, par exemple ls -l *(.) liste seulement les fichiers.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Oui, mais tout ça n'est pas du bash, c'est du shell !

    Ça, c'est du
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    for dir in ~/*; do if [ -d "$dir" ]; then ((cpt++)); fi; done; echo "Il y a $cpt répertoire dans" ~
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 7
    Par défaut
    Premièrement Merci beaucoup à vous tous pour vos propositions, j'apprécie beaucoup votre aide

    J'ai testé vos différentes propositions :
    - syjis
    file $1/* | grep directory | wc -l
    Ce script me donne le même résultat que find ~/Bureau -type d | wc -l, c'est à dire qu'il compte bien les dossiers, mais pas ceux qui contiennent d'autre dossiers.

    -iblis
    - find . -type d -maxdepth 1 | wc -l
    Cette commande semble convenir à 100% je teste sur différents dossiers et tout semble OK.
    - ls -d1 */ | wc -l
    Cela fonctionne aussi sauf que je ne peut mettre le répertoire à analyser en paramètre.

    Donc MERCI encore pour vos réponses, mon 1er problème est résolu , il reste les scripts pour le calcul de la moyenne d'une série de chiffre passé en paramètres, puis une série contenue dans un fichier, au cas où vous aviez de bonne idées.

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Salut.

    Citation Envoyé par sleepers56 Voir le message
    il reste les scripts pour le calcul de la moyenne d'une série de chiffre passé en paramètres, puis une série contenue dans un fichier, au cas où vous aviez de bonne idées.
    Je me permet de t'indiquer cet article ... c'est un article où je propose différents exercices en Bash corrigés et certains pourront t'aider à résoudre ton problème (on y trouve par exemple l'utilisation des paramètres, etc).


    Je te laisses y faire un tour et y réfléchir, et revient si tu as des questions

    Cordialement,
    Idriss

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 7
    Par défaut
    Concernant mon calcul de moyenne j'ai fait ceci :
    J'ai mis des commentaires j'espère ne pas avoir surchargé mon post

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash <div style="margin-left:40px"> # initialisation des variables</div>chiffres=0 
    moyenne=0
    i=0<div style="margin-left:40px">       # test de $chiffres < 0</div>until [ $chiffres -lt 0 ]             
    do
        echo "Entrez un chiffre puis ENTER pour entrer le chiffre suivant (tapez q puis ENTER pour calculer la moyenne) : "<div style="margin-left:40px"> # les nombres sont "stocker" dans $chiffres</div>read chiffres             <div style="margin-left:40px"># test de $chiffres pour verifier l'execution du calcul</div>if [ $chiffres = "q" ]                  
        then<div style="margin-left:40px"># si calcul demandé, mise a -1 de chiffres</div>chiffres=-1  
     
        fi<div style="margin-left:40px">    # test de $chiffres >= 0</div>if [ $chiffres -ge 0 ]               
       then<div style="margin-left:40px"> # ajouts des nombres contenu dans $chiffres</div>let moyenne=$moyenne+$chiffres     <div style="margin-left:40px"> # incrementation d'un compteur qui calcul le nombre de chiffres total</div>let i=$i+1                         
       fi
    done<div style="margin-left:40px"># calcul de la moyenne</div>let moyenne=$moyenne/$i                     
    echo "La moyenne est de $moyenne"
    - Celà fonctionne mais m'oblige à utiliser des nombres entiers...pour y remédier je sais que l'on peut utiliser scale=1 ou bc -l mais je n'arrive pas à placer ces commandes correctement quelqu'un peut m'aider?
    - J'ai peut être rendu complexe ma solution, avez vous des améliorations à me proposer?

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Salut,.

    Tu peut par exemple remplacer cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let moyenne=$moyenne/$i
    par cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    moyenne=$(echo $moyenne/$i | bc -l)
    Bash n'est pas fait pour faire des calculs et ne gère pas les nombres à virgule, il faut donc faire appel à un programme externe comme bc.

    Sinon n'oublies pas les balises codes (symbôle # quand tu poste), pour une meilleur présentation de ton code.

    Cordialement,
    Idriss.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 7
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    moyenne=$(echo $moyenne/$i | bc -l)
    Bash n'est pas fait pour faire des calculs et ne gère pas les nombres à virgule, il faut donc faire appel à un programme externe comme bc.
    il est possible de régler la taille des nombres après la virgule du résultat?
    Et comment modifier le script pour qu'il accepte les nombres à virgules dans le calcul?

Discussions similaires

  1. Comptage et calcul de moyenne
    Par shaun_the_sheep dans le forum Langage SQL
    Réponses: 12
    Dernier message: 29/10/2009, 17h17
  2. [VBA-E] problème de calcul de moyenne
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/04/2006, 17h13
  3. Programmation Shell avec Red Hat Calcul de moyenne
    Par jcpoulard dans le forum Linux
    Réponses: 3
    Dernier message: 22/02/2006, 22h08
  4. methode qui calcul une moyenne du traffic
    Par siry dans le forum Développement
    Réponses: 7
    Dernier message: 05/05/2005, 17h16
  5. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

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