#1 Le 04/02/2010, à 16:28
- mega-jp
comptage de dossier et calcul de moyenne
Salut à tous,
Pour un cours d'informatique je doit réaliser 3 petits programmes en Shell, mais je bloque dessus, c'est pourquoi je souhaiterais un petit coup de main.
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.
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.
Hors ligne
#2 Le 04/02/2010, à 17:16
- Totor
Re : comptage de dossier et calcul de moyenne
Bonjour,
Il s'agit d'un excerice, je ne te donnerai donc pas les solutions car cela ne t'aidera pas.
Pour ta 1ere demande, consulte le man de find. Il y a ce qu'il te faut.
Pour le reste, si tu n'as pas besoin d'une précision à décimale, consulte le man du bash, section "ARITHMETIC EVALUATION". Si les décimaux sont à gérer, regarde du côté de l'outil "bc"
Cela dit, normalement tu devrais avoir toutes les réponses dans tes cours
-- Lucid Lynx --
Hors ligne
#3 Le 04/02/2010, à 17:35
- mega-jp
Re : comptage de dossier et calcul de moyenne
Pour le comptage de dossier j'ai tester :
find ~/Bureau/* -type d -prune
mais du coup les dossiers qui contiennent des sous-dossiers ne sont pas comptés....:/
Hors ligne
#4 Le 04/02/2010, à 17:38
- Totor
Re : comptage de dossier et calcul de moyenne
beeeeeeeeeeeeeeeeeeeeep
-prune = mauvaise réponse
-- Lucid Lynx --
Hors ligne
#5 Le 04/02/2010, à 17:40
- mega-jp
Re : comptage de dossier et calcul de moyenne
j'ai fouiller le find jusqu'au bout mais je n'ai vu que ce début de solution
Hors ligne
#6 Le 04/02/2010, à 17:50
- Totor
Re : comptage de dossier et calcul de moyenne
alors tape :
man bash
puis
/-m.{5}th
si tu ne trouves rien, oublies find...
-- Lucid Lynx --
Hors ligne
#7 Le 04/02/2010, à 17:53
- sputnick
Re : comptage de dossier et calcul de moyenne
Totor, je trouve ton, attitude un max "depth" ;)
Pas besoin de find en fait.
J'ai confiance au fait que tu demande des réponses mais que tu souhaite les comprendre.
Donc, deux solutions :
printf '%s\n' */ | wc -l
x=( */ ); echo ${#x[@]}
On est pas loin si tu ne comprends pas. La deuxieme solution utilise les tableaux.
Dernière modification par sputnick (Le 04/02/2010, à 17:53)
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#8 Le 04/02/2010, à 17:57
- Totor
Re : comptage de dossier et calcul de moyenne
On est pas loin si tu ne comprends pas. La deuxieme solution utilise les tableaux.
moi je crains que ce soit son/sa prof qui ne comprenne pô
-- Lucid Lynx --
Hors ligne
#9 Le 04/02/2010, à 17:57
- mega-jp
Re : comptage de dossier et calcul de moyenne
pattern not found avec /-m.{5}th
Hors ligne
#10 Le 04/02/2010, à 17:59
- Totor
Re : comptage de dossier et calcul de moyenne
pattern not found avec /-m.{5}th
tu ne serais pas sur du solaris toi (ou du HP mais je n'y crois pas) ?
c'est quoi comme distrib ?
-- Lucid Lynx --
Hors ligne
#11 Le 04/02/2010, à 18:03
- mega-jp
Re : comptage de dossier et calcul de moyenne
mon pc est un hp, ma version de ubuntu c'est le Ubuntu 9.10 - le Koala Karmique
Hors ligne
#12 Le 04/02/2010, à 18:08
- mega-jp
Re : comptage de dossier et calcul de moyenne
j'espère répondre à ta question
Hors ligne
#13 Le 04/02/2010, à 18:29
- mega-jp
Re : comptage de dossier et calcul de moyenne
sputnick,
ta solution printf '%s\n' */ | wc -l ,marche à la perfection, mais je doit donner le répertoire à "analyser" en paramètre du script.
Pourrait tu également m'expliquer le fonctionnement de cette commande?
Merci de votre aide à tous les deux
Hors ligne
#14 Le 04/02/2010, à 19:30
- sputnick
Re : comptage de dossier et calcul de moyenne
mega-jp, peux tu me dire ce que la commande fait en Francais ?
printf '%s\n' "$1"/*/
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#15 Le 04/02/2010, à 20:49
- mega-jp
Re : comptage de dossier et calcul de moyenne
sputnick
j'ai tester ton script et en le modifiant comme ceci : printf '%s\n' ~/Bureau/*/ | wc -l
j'ai mis ~/Bureau/ à la place de "$1" pour tester le fonctionnement, et en rajoutant wc -l pour compter, cela marche à 100%, MERCI beaucoup !
Il semblerai que: find ~/Bureau -maxdepth 1 -type d | wc -l
marche également mais avec des commandes différentes.
Le problème 1 est résolu:D, il me reste à encore fouiner pour les 2 scripts de calcul de moyenne.
Hors ligne
#16 Le 04/02/2010, à 23:12
- nesthib
Re : comptage de dossier et calcul de moyenne
question 2 :
function moy {
sum=0
for ((i=1 ; i<=$# ; i++ )); do
sum=$(( $sum + ${!i} ))
done
echo "somme : $sum"
echo -n "moyenne : "
echo "scale=2 ; $sum / $#" | bc
}
je te propose (comme sputnick) que tu rédiges un post pour expliquer ce que fait le code précédent ligne à ligne.
après à toi de nous donner la réponse pour la question 3 (indices : while et read)
NB. le code précédent est incomplet et nécessite quelques précautions que je te laisse chercher.
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#17 Le 05/02/2010, à 10:01
- Totor
Re : comptage de dossier et calcul de moyenne
question 2:
#!/bin/bash
[ $# -eq 0 ] && exit 1
sum="($@)/$#"
bc <<< "scale=2;${sum// /+}"
Edit :
@nesthib : plutôt que de boucler sur les indices :
sum=0
for num
do
((sum+=num))
done
echo "Somme=${sum}"
Dernière modification par Totor (Le 05/02/2010, à 10:07)
-- Lucid Lynx --
Hors ligne
#18 Le 05/02/2010, à 11:49
- nesthib
Re : comptage de dossier et calcul de moyenne
@Totor : j'avais pensé à un truc du genre de ta solution 1 (s/ /+/) mais malgré l'excellente solution ce n'est pas le plus didactique (le prof va tirer la tronche là)
pour la boucle tu as tout à fait raison, c'est plus simple d'utiliser directement les valeurs, j'ai pensé un peu trop vite
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#19 Le 05/02/2010, à 14:07
- Totor
Re : comptage de dossier et calcul de moyenne
@Totor : j'avais pensé à un truc du genre de ta solution 1 (s/ /+/) mais malgré l'excellente solution ce n'est pas le plus didactique (le prof va tirer la tronche là)
pas forcément : tout dépend comment elle est présentée : l'aspect "autonomie / recherche" est un point fort. De plus, il peut la donner comme solution complémentaire suivant ce qu'attend le prof.
du style :
Solution conventionnelle avec le "for"..
En complément, voici une solution plus spécifique au language bash...
-- Lucid Lynx --
Hors ligne
#20 Le 05/02/2010, à 14:34
- mohus
Re : comptage de dossier et calcul de moyenne
edit modo : merci de respecter les règles du forum : ne pas polluer le fil de discussion des autres et respecter les catégories du forum. Ouvre ton propre fil dans la catégorie adaptée.
ps. Pose également tes questions de façon plus explicite.
Dernière modification par nesthib (Le 05/02/2010, à 16:41)
Hors ligne
#21 Le 07/02/2010, à 17:17
- mega-jp
Re : comptage de dossier et calcul de moyenne
Concernant mon calcul de moyenne j'ai fait ceci :
#!/bin/bash
chiffres=0 # initialisation des variables
moyenne=0
i=0
until [ $chiffres -lt 0 ] # test de $chiffres < 0
do
echo "Entrez un chiffre puis ENTER pour entrer le chiffre suivant (tapez q puis ENTER pour calculer la moyenne) : "
read chiffres # les nombres sont "stocker" dans $chiffres
if [ $chiffres = "q" ] # test de $chiffres pour verifier l'execution du calcul
then
chiffres=-1 # si calcul demande, mise a -1 de chiffres
fi
if [ $chiffres -ge 0 ] # test de $chiffres >= 0
then
let moyenne=$moyenne+$chiffres # ajouts des nombres contenu dans $chiffres
let i=$i+1 # incrementation d'un compteur qui calcul le nombre de chiffres total
fi
done
let moyenne=$moyenne/$i # calcul de la moyenne
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?
edit modo : balises code
Dernière modification par nesthib (Le 08/02/2010, à 00:00)
Hors ligne