[Shell/Bash] Compter nombre de fichiers dans un répertoire

Compter nombre de fichiers dans un répertoire [Shell/Bash] - Shell/Batch - Programmation

Marsh Posté le 18-09-2008 à 11:32:35    

Hello  :hello:  
 
Dans le cadre d'une supervision via Nagios, je dois compter le nombre de fichiers dans un répertoire donné, ainsi qu'un de ses sous répertoire nommé "error" (donc deux résultats distincts).
Jusque là pas de probleme je fais ceci :


NBFILE1=$(ls -A1 $MONREPERTOIRE | wc -l)
NBFILE2=$(ls -A1 $MONREPERTOIRE/error/ | wc -l)


 
Maintenant j'aimerai si dans $MONREPERTOIRE si j'ai moins de 5 fichiers.
Mais également que si dans $MONREPERTOIRE/error/ si j'ai moins de 1 fichiers.
 
D'après tout ça, je dois sortir soit en exit0 si OK et exit2 si KO (nb fichiers supérieur au seuil), mais également afficher via un echo, le ou les répertoire(s) depassant ce seuil limite.
 
Pourriez vous m'aider svp ?


---------------
Neo_t3 registered Linux user number 354648. | http://www.ondaflow.com
Reply

Marsh Posté le 18-09-2008 à 11:32:35   

Reply

Marsh Posté le 18-09-2008 à 11:33:38    

man test
 
Par exemple en ksh :
if [ "$NBFILE1" -ge 5 ]
then
   blabla
fi

Reply

Marsh Posté le 18-09-2008 à 11:40:01    

Elmoricq a écrit :

man test
 
Par exemple en ksh :
if [ "$NBFILE1" -ge 5 ]
then
   blabla
fi


 
Merci beaucoup, j'ai oublié de préciser, je sais y arriver comme cela puisque mon script fonctionnait auparavant mais en comptant que dans $MONREPERTOIRE, pas de la sous répertoire error.
 


#!/bin/sh
 
MONREPERTOIRE=$1
SEUILCRITIQUE=$2
 
MAVALEUR=$(ls -A1 $MONREPERTOIRE | wc -l)  
 
if [ $MAVALEUR -gt $SEUILCRITIQUE ]
then  
echo "CRITICAL - Le nombre de fichiers ($MAVALEUR) en attente dans $MONREPERTOIRE a depasse le seuil critique de $SEUILCRITIQUE fichiers"  
exit 2
fi
echo "OK - Le nombre de fichiers en attente dans $MONREPERTOIRE est correct"
exit 0


 
Ce que je n'arrive pas c'est imbriqué tout ça avec le sous répertoire...


Message édité par Neo_t3 le 18-09-2008 à 11:41:55

---------------
Neo_t3 registered Linux user number 354648. | http://www.ondaflow.com
Reply

Marsh Posté le 18-09-2008 à 11:49:25    

Tu veux faire les deux tests en même temps, si j'ai bien compris ?

Reply

Marsh Posté le 18-09-2008 à 12:07:30    

Elmoricq a écrit :

Tu veux faire les deux tests en même temps, si j'ai bien compris ?


 
Oui voila, faire les deux test, et obtenir :
- Un etat OK si les deux répertoire ne dépassent pas leur seuil
- Une alarme CRITICAL si un répertoire dépassent le seuil en affichant ce répertoire


---------------
Neo_t3 registered Linux user number 354648. | http://www.ondaflow.com
Reply

Marsh Posté le 18-09-2008 à 12:09:12    

if [ test1 -o test2 ]

 

ou

 

if [ test1 ] || [ test2 ]

Message cité 2 fois
Message édité par Elmoricq le 18-09-2008 à 12:09:22
Reply

Marsh Posté le 18-09-2008 à 12:36:24    

Elmoricq a écrit :

if [ test1 -o test2 ]
 
ou
 
if [ test1 ] || [ test2 ]


 
Thanks j'ai deja un debut,
 
En fait c'est :  
- si test1 et test2 sont inferieur à 1 alors OK
- si test1 est superieur a 5 alors KO
- si test2 est superieur a 1 alors KO
 
Et si test1 et test2 depassent leur seuil (1 et 5) alors KO sur les deux rep


Message édité par Neo_t3 le 18-09-2008 à 12:40:33

---------------
Neo_t3 registered Linux user number 354648. | http://www.ondaflow.com
Reply

Marsh Posté le 18-09-2008 à 13:18:39    

if [ condition1 -lt 1 -a condition2 -lt 1 ]
ou
if [ condition1 -lt 1 ] && [ condition2 -lt 1 ]
 
Pour les deux autres tu devrais y arriver.
 
Encore une fois : man test

Reply

Marsh Posté le 18-09-2008 à 16:03:35    

Merci beaucoup, j'ai pu avancer un peu mais le script s'arrete au premier OK
 


#!/bin/sh
 
MONREPERTOIRE=$1
SEUILCRITIQUE=$2
SEUILCRITIQUE2=$3
 
NBFILE1=$(ls -A1 $MONREPERTOIRE | wc -l)
NBFILE2=$(ls -A1 $MONREPERTOIRE/error/ | wc -l)
 
 
if [ $NBFILE1 -gt $SEUILCRITIQUE -a $NBFILE2 -gt $SEUILCRITIQUE2 ]; then
echo "CRITICAL - Il y a $NBFILE1 fichiers en erreur dans $MONREPERTOIRE et $NBFILE2 fichiers en erreur dans $MONREPERTOIRE/error"
exit 2
fi
 
if [ $NBFILE1 -le $SEUILCRITIQUE ]; then
echo "CRITICAL - Il y a $NBFILE1 fichiers en erreur dans $MONREPERTOIRE"
exit 2
else
echo "OK - Le nombre de fichiers en attente dans le repertoire est correct"
exit 0
fi
 
if [ $NBFILE2 -le $SEUILCRITIQUE2 ]; then
echo "CRITICAL - Il y a $NBFILE2 fichiers en erreur dans $MONREPERTOIRE/error"
exit 2
else
echo "OK - Le nombre de fichiers en attente dans le repertoire est correct"
fi


 


sh check_number_of_file.sh /tmp 1 1
OK - Le nombre de fichiers en attente dans le repertoire est correct


 
Faut il imbriquer les deux derniers blocs avec un elif ?


Message édité par Neo_t3 le 18-09-2008 à 16:04:33

---------------
Neo_t3 registered Linux user number 354648. | http://www.ondaflow.com
Reply

Marsh Posté le 18-09-2008 à 16:11:56    

J'ai trouvé c'est OK :
 


#!/bin/sh
 
MONREPERTOIRE=$1
SEUILCRITIQUE=$2
SEUILCRITIQUE2=$3
 
NBFILE1=$(ls -A1 $MONREPERTOIRE | wc -l)
NBFILE2=$(ls -A1 $MONREPERTOIRE/error/ | wc -l)
 
 
if [ $NBFILE1 -gt $SEUILCRITIQUE -a $NBFILE2 -gt $SEUILCRITIQUE2 ]; then
echo "CRITICAL - Il y a $NBFILE1 fichiers en erreur dans $MONREPERTOIRE et $NBFILE2 fichiers en erreur dans $MONREPERTOIRE/error"
exit 2
fi
 
if [ $NBFILE1 -gt $SEUILCRITIQUE ]; then
echo "CRITICAL - Il y a $NBFILE1 fichiers en erreur dans $MONREPERTOIRE"
exit 2
fi
 
if [ $NBFILE2 -gt $SEUILCRITIQUE2 ]; then
echo "CRITICAL - Il y a $NBFILE2 fichiers en erreur dans $MONREPERTOIRE/error"
exit 2
fi
 
if [ $NBFILE1 -le $SEUILCRITIQUE -a $NBFILE2 -le $SEUILCRITIQUE2 ]; then
echo "OK : Aucun fichiers en attente dans le repertoire"
exit 0
fi


---------------
Neo_t3 registered Linux user number 354648. | http://www.ondaflow.com
Reply

Marsh Posté le 18-09-2008 à 16:11:56   

Reply

Marsh Posté le 20-09-2008 à 11:30:21    

Elmoricq a écrit :

if [ test1 -o test2 ]
 
ou
 
if [ test1 ] || [ test2 ]
 
if [ condition1 -lt 1 -a condition2 -lt 1 ]
ou
if [ condition1 -lt 1 ] && [ condition2 -lt 1 ]


 
Il faut faire attention à chaque écriture car elle n'est pas tout à fait équivalente.
 
La première, qui utilise les connecteurs "-a" (and) et "-o" (or) de l'instruction "test" correspond à un seul appel de cette instruction. Celle-ci est appelée une fois et fait toutes les comparaisons demandées même si le test est déjà définitif et devient donc inutile.
 
Exemple

Code :
  1. test -n "hello" -o -n "`touch /tmp/toto`"


Etant donné que "hello" n'est pas une chaine vide, le test est déjà vrai. Pourtant le fichier "/tmp/toto" est quand-même créé.
 
La seconde est une suite de deux instructions séparées par un connecteur and/or traité par le shell lui-même (et non par la commande "test" ). Il y a donc deux appels à l'instruction test mais si l'un des tests devient définitifs, l'ensemble s'arrête
 
Exemple

Code :
  1. test -n "hello" || test -n "`touch /tmp/toto`"


Le fichier "/tmp/toto" ne sera jamais créé
 
C'est bien de le savoir. Mais malgré le fait que l'ensemble "&&" et "||" puisse être plus rapide, personnellement je préfère utiliser "-a" et "-o" (et utiliser intelligemment le tableau de Karnaugh pour optimiser moi-même)...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed