Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1170 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [shell script] Compter des repertoires

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[shell script] Compter des repertoires

n°1118043
Namoureux
Posté le 02-03-2009 à 15:25:40  profilanswer
 

Bonjour.  
 
J'ai un shell script à faire, mais je bloque sur une partie. Il s'agit de compter le nombre de répertoire d'un dossier donné. Voila ce que j'ai fait :
 
find #monRepertoire# -maxdepth 1 -type d | wc -l,  
 
soit en gros : je trouve, je compte les lignes. Problème : le find me donne aussi les fichiers cachés (/.config par exemple), et je n'en veut pas !
 
De plus, je voudrais comperer ce que je trouve à 0 ou 1, j'ai donc fait  
 
 if ((nbRep == 0) || (nbRep == 1)) then  
 
mais ça ne marche pas (nbRep ne doit pas être de type int)
 
Merci de me dire comment faire !


Message édité par Namoureux le 02-03-2009 à 15:27:17
mood
Publicité
Posté le 02-03-2009 à 15:25:40  profilanswer
 

n°1118056
matafan
Posté le 02-03-2009 à 17:02:02  profilanswer
 

nbrep=`ls -l | grep -c ^d`
if [ $nbrep = '0' ] || [ $nbrep = '1' ]
then
    ...
fi

n°1118407
sputnick
bip...bip...bip...bip...bi...b
Posté le 03-03-2009 à 20:27:03  profilanswer
 

Je ne vous conseille pas ls + traitements, ce n'est pas fiable. Cela dépend trop de la distrib. ( même si cela fonctionne, c'est pas optimum )
 
Je propose en bash :  

Code :
  1. REPS=( */ )
  2. [[ ${REPS[@]} == '*/' ]] && echo "Pas de répertoires..." || echo "Il y a au moins un répertoire"


 
je n'utilise que des builtins bash... Cela nécessite que "shopt -s nullglob" ne soit pas activé.
Pour vérifier c'est très simple : shopt | grep nullglob.
Si il est actif, il suffit de remplacer le test du dessus par [[ ${REPS[@]} ]]
 
++

Message cité 1 fois
Message édité par sputnick le 04-03-2009 à 17:45:31
n°1118458
matafan
Posté le 03-03-2009 à 23:08:02  profilanswer
 

sputnick a écrit :

Je ne vous conseille pas ls + traitements, ce n'est pas fiable


:heink:
Faudra m'expliquer pourquoi.

n°1118466
sputnick
bip...bip...bip...bip...bi...b
Posté le 04-03-2009 à 00:21:56  profilanswer
 

Greybot de #bash sur irc.freenode.org  va te l'expliquer :

Citation :

<greybot> Please NEVER parse, pipe, grep, capture, read, or loop over the output of 'ls'. Unlike popular belief, 'ls' is NOT designed to enumerate files or parse their statistics. Using 'ls' for this is dangerous (word splitting) and there's always a better way; eg. globs: files=(*).


 
#bash est un channel tres actif ou on pratique un bash moderne en évitant les eceuils. Il y a là de vrais gurus du shell. On essaye de trouver des solutions les plus portable possible la plupart du temps. ( Oui je participe assez souvent même si je ne suis pas encore un guru  :p  ).

n°1118496
matafan
Posté le 04-03-2009 à 09:10:59  profilanswer
 

Certes mais là on ne regarde que la première lettre de la ligne. Il n'y a donc aucun danger, et c'est parfaitement portable (au contraire des globs).
 
Faire du bash moderne c'est bien, faire du shell portable c'est souvent mieux.

n°1118532
Hrolf
Posté le 04-03-2009 à 10:35:16  profilanswer
 

find #monRepertoire# -maxdepth 1 -type d ! -name ".*" | wc -l  
 
Ca marche aussi, c'est moins propre que le bash mais plus que le ls.


---------------
Il y a trois sortes de mensonges : les mensonges, les gros mensonges et les statistiques !
n°1118666
matafan
Posté le 04-03-2009 à 15:38:14  profilanswer
 

Mais -maxdepth n'est pas portable.

n°1118705
sputnick
bip...bip...bip...bip...bi...b
Posté le 04-03-2009 à 17:33:15  profilanswer
 

matafan a écrit :

Certes mais là on ne regarde que la première lettre de la ligne. Il n'y a donc aucun danger, et c'est parfaitement portable (au contraire des globs).
 
Faire du bash moderne c'est bien, faire du shell portable c'est souvent mieux.


 
Peux-tu me citer une distro/plate forme ou les globs bash ne sont pas portables ?

n°1118710
sputnick
bip...bip...bip...bip...bi...b
Posté le 04-03-2009 à 17:45:09  profilanswer
 

J'avait oublié un caractere dans mon code, c'est rectifié ( '*' changé en '*/' )

mood
Publicité
Posté le 04-03-2009 à 17:45:09  profilanswer
 

n°1118733
Hrolf
Posté le 04-03-2009 à 19:10:54  profilanswer
 

sputnick a écrit :


 
Peux-tu me citer une distro/plate forme ou les globs bash ne sont pas portables ?


 
Solaris8, j'en ai encore une 15aine en prod.


Message édité par Hrolf le 04-03-2009 à 19:11:10

---------------
Il y a trois sortes de mensonges : les mensonges, les gros mensonges et les statistiques !
n°1118735
sputnick
bip...bip...bip...bip...bi...b
Posté le 04-03-2009 à 19:25:23  profilanswer
 

hrolf, peux tu faire cela et mettre le resultat ici ?

Code :
  1. cd /; bash -c 'echo *'


 
De toutes façons pour du code portable *vraiment portable* il faut utiliser perl.
Avec le shell il y aura toujours à batailler.
Mais pour des GNU/Linux il n'y a en général aucun souci.

n°1118791
Hrolf
Posté le 04-03-2009 à 23:03:53  profilanswer
 

bash : "file not found" ?
 
Sur Solaris8 y'a pas bash :D
Et il est totalement hors de question que j'installe des packages de ce genre sur de vielles bouses dont personne n'est capable de me dire exactement comment elles sont installé et configuré, j'ai soulevé assé de tapis comme ça pas envi de trouver d'autres cadavres :p
 
Oui ça parrait con, mais les Linux ne sont pas les seul OSA, y'a les Unix dans le tas et dans beaucoup d'Unix bash n'est pas installé de base, voir pas installable du tout.
Y'en a même qui ont csh comme shell de base :o


---------------
Il y a trois sortes de mensonges : les mensonges, les gros mensonges et les statistiques !
n°1118797
sputnick
bip...bip...bip...bip...bi...b
Posté le 04-03-2009 à 23:31:33  profilanswer
 

vous dont hrolf, noterez que j'ai bien précisé  
"Je propose en bash : " et pas "je propose en shell : " donc je persiste à dire que si bash est installé, cela est portable.  :wahoo:  
 
Pour des shells plus "rustiques", essayez ça :
 

Citation :

 
    cd foo || exit 1
    if test "`printf '%s %s %s' .* */`" = '. .. *' && test ! -f '*/'
    then
        echo "there's no dirs here"
    else
        echo "there's dir(s) here"
    fi


 
adaptation depuis : http://mywiki.wooledge.org/BashFAQ/004


Message édité par sputnick le 04-03-2009 à 23:40:13
n°1119910
Namoureux
Posté le 09-03-2009 à 11:31:48  profilanswer
 

En fait, voila ce que je fais, et voila aussi ce qui ne marche pas.
je fais donc mon petit ls -d */, qui marche très bien (si, si!)
ls -d */ >& /dev/null
if ($status == 0) then
          set nbRep = `ls -d */ | wc -l` et je sors nbRep
else
        echo "le répertoire ne contient pas de répertoire" (en gros)
endif
 
Voila mon soucis : le ls -d */ >& /dev/null fait des trucs bizarres... De manière générale, je n'arrive pas à voir la valeur de status...
J'ai bien essayé echo $status dans le terminal, mais ça me renvoie une ligne désespérément vide (que j'ai ou non entré un comme valide auparavant)... Ou cela coince t'il ?
Merci d'avance !
 
 
edit : ah zut je viens de voir que mon message avec le "merci, mais je crois que je vais utiliser ls -d */ qui me semble simple" n'est pas passé... Alors merci à tous pour vos precedentes réponses !


Message édité par Namoureux le 09-03-2009 à 11:33:53
n°1119933
matafan
Posté le 09-03-2009 à 12:53:55  profilanswer
 

C'est sensé être quoi "$status" ? Tu veux dire "$?" ?

n°1119954
Xpif
Posté le 09-03-2009 à 13:53:08  profilanswer
 

:hello:
 
normalement $status correspond a la valeur de ta variable associée
ds le script de Namoureux, on ne voit pas son affectation..
au pif,  
status=`ls -d */ > /dev/null`
echo $status donnerai la resultat de la cmde par exemple
 
sauf gourance de ma part

n°1119962
sputnick
bip...bip...bip...bip...bi...b
Posté le 09-03-2009 à 14:02:44  profilanswer
 

namoueux, tu est faché avec les solutions propres ? On t'a donné le code, tu a juste à recopier et éventuellement adapter.
Qu'est-ce qui ne te convient pas ? Peux-etre n'a tu pas compris les réponses, dans ce cas demande !
On ne connait pas ta distribution. Peux tu la préciser ?
Ls j'ai pas dit que ça marchait pas mais juste c'est crade.

n°1120487
Namoureux
Posté le 10-03-2009 à 16:14:26  profilanswer
 

Bonjour à tous !
 
Tout d'abord, non, je ne suis pas faché avec les solutions propres, mais je suis étudiant, et ces solutions font appel à des notion que je n'ai pas vu, et donc que je n'ai pas le droit d'utiliser (hé oui, c'est pour un dm).
En fait, la variable status contient le code de sortie du dernier programme exécuté. Donc, si le programme a bien tourné, status renvoie 0, sinon la variable est non nulle. Je dois m'en servir, mais ça ne fonctionne pas (quand je fait echo $status après une commande, qu'elle se soir ou non bien exécutée, ça ne me renvoie rien)
 
Voila mes soucis, peut on m'aider à ce niveau ?
Merci en tout cas de prendre le temps de m'aider !

n°1120490
Namoureux
Posté le 10-03-2009 à 16:24:14  profilanswer
 

Oula, je vais me faire taper : cette variable marche en tcsh, et j'étais en bash... L'air bien bête que je viens de me taper...

n°1120570
matafan
Posté le 10-03-2009 à 22:06:59  profilanswer
 

En shell (sh) c'est $?

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [shell script] Compter des repertoires

 

Sujets relatifs
[Shell script] Comment convertir une ligne en tableau[Shell] Remplacer dans un fichier en ligne de commande
compter les fichiers selon leur extensionScript bash : récuperer des données dans un fichier
erreur dans un script perlScript pour compresser des fichiers (texte) tous les jours?
creation shell account Pour utiliser bnc et eggdropScript bash: Permission non accordée !?
Plus de sujets relatifs à : [shell script] Compter des repertoires


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR