Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 04/02/2010, 18h33   #1
Invité de passage
 
jean-philippe
Inscription : février 2010
Messages : 7
Détails du profil
Informations personnelles :
Nom : jean-philippe

Informations forums :
Inscription : février 2010
Messages : 7
Points : 0
Points : 0
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.
sleepers56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2010, 18h46   #2
Nouveau Membre du Club
 
David
Inscription : avril 2009
Messages : 26
Détails du profil
Informations personnelles :
Nom : David
Âge : 40

Informations forums :
Inscription : avril 2009
Messages : 26
Points : 27
Points : 27
Bonjour sleepers56,

Pour ton premier programme, tu peux utiliser file
Code :
file $1/* | grep directory | wc -l
syjis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2010, 19h12   #3
Membre expérimenté
 
Avatar de iblis
 
Inscription : janvier 2007
Messages : 510
Détails du profil
Informations personnelles :
Âge : 45

Informations forums :
Inscription : janvier 2007
Messages : 510
Points : 508
Points : 508
Envoyer un message via Yahoo à iblis
Tu peux bien sûr limiter la profondeur de la recherche de find :
Code :
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.
iblis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2010, 19h26   #4
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 896
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 896
Points : 3 676
Points : 3 676
Oui, mais tout ça n'est pas du bash, c'est du shell !

Ça, c'est du
Code bash :
for dir in ~/*; do if [ -d "$dir" ]; then ((cpt++)); fi; done; echo "Il y a $cpt répertoire dans" ~
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2010, 20h44   #5
Invité de passage
 
jean-philippe
Inscription : février 2010
Messages : 7
Détails du profil
Informations personnelles :
Nom : jean-philippe

Informations forums :
Inscription : février 2010
Messages : 7
Points : 0
Points : 0
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.
sleepers56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2010, 21h14   #6
Modérateur
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Développeur en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 704
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Développeur en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 704
Points : 4 345
Points : 4 345
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 ce sujet ... c'est un sujet 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
__________________
modérateur rubriques Linux/Unix et chat

Dernière modification par ok.Idriss ; 04/02/2010 à 22h03. Motif: orthographe
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 17h23   #7
Invité de passage
 
jean-philippe
Inscription : février 2010
Messages : 7
Détails du profil
Informations personnelles :
Nom : jean-philippe

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

Code :
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash<blockquote> # initialisation des variables</blockquote>chiffres=0 
moyenne=0
i=0<blockquote>       # test de $chiffres < 0</blockquote>until [ $chiffres -lt 0 ]             
do
    echo "Entrez un chiffre puis ENTER pour entrer le chiffre suivant (tapez q puis ENTER pour calculer la moyenne) : "<blockquote> # les nombres sont "stocker" dans $chiffres</blockquote>read chiffres<blockquote># test de $chiffres pour verifier l'execution du calcul       </blockquote>if [ $chiffres = "q" ]                  
    then<blockquote># si calcul demandé, mise a -1 de chiffres</blockquote>chiffres=-1  
 
    fi<blockquote>    # test de $chiffres >= 0</blockquote>if [ $chiffres -ge 0 ]               
   then<blockquote> # ajouts des nombres contenu dans $chiffres</blockquote>let moyenne=$moyenne+$chiffres<blockquote> # incrementation d'un compteur qui calcul le nombre de chiffres total     </blockquote>let i=$i+1                         
   fi
done<blockquote># calcul de la moyenne</blockquote>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?

Dernière modification par al1_24 ; 07/02/2010 à 20h03.
sleepers56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 17h56   #8
Modérateur
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Développeur en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 704
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Développeur en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 704
Points : 4 345
Points : 4 345
Salut,.

Tu peut par exemple remplacer cette ligne :

Code :
let moyenne=$moyenne/$i
par cette ligne :

Code :
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.
__________________
modérateur rubriques Linux/Unix et chat
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2010, 21h09   #9
Invité de passage
 
jean-philippe
Inscription : février 2010
Messages : 7
Détails du profil
Informations personnelles :
Nom : jean-philippe

Informations forums :
Inscription : février 2010
Messages : 7
Points : 0
Points : 0
Citation:
Envoyé par ok.Idriss Voir le message

Code :
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?
sleepers56 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 20h37.


 
 
 
 
Partenaires

Hébergement Web