1.1 Oui. On applique l'operateur = (ressemble a) et ici le motif demande apparait dans $a 1.2 Vrai 1.3 Vrai 1.4 Vrai 1.5 Vrai 1.6 Non, pas exactement car les ll peuvent apparaitre quelque part dans la ligne renvoyee par ps -aux et pas forcement dans le nom du programme 2- La difficulte consiste a iterer un traitement de type "tail ... | head ..." qui a ete vu en TP dans un exercice. Le test de terminaison, ici while [ $i -le $myend ] peut s'implementer de plusieurs autres manieres (avec 'test' par ex). Si l'algorithme suivi est explique mais faux dans l'implementation et a certains endroits, on peut mettre quelques points... laisse' a l'appreciation du correcteur. Proposition de code : #!/bin/bash if [ $# -eq 3 ]; then if [ $1 -le $2 ]; then if [ -e $3 ]; then ### Debut de la partie difficile ####### myend=`cat $3 |wc -l` i=1 while [ $i -le $myend ] do Echo "Ligne $i:" tail +$i $3 | head -n$1 I=$(($i + $2)) done ### fin de la partie difficile ####### else echo "$0: Error opening file $3" exit 2 fi else echo "paramer 1 ($1) must be <= parameter 2 ($2)" fi else echo "Missing arguments!" fi 3- Le code prend en parametre 1 argument (un entier) qui represente un nombre de jours. Le code detruit les fichiers du repertoire $HOME/.poubelle dont les donnees ont ete modifiees il y a $1*24 heures. Dans le cas ou l'utilisateur ne passe pas de parametre, le nombre d'heures est fixe a 30*24. #!/bin/bash # Source: M. Divay case $# in 0)NB=30;; 1)NB=$1;; *)echo "usage: $0 [nombre-de-jours]"; exit 1;; esac Reppou=$HOME/.poubelle if [ ! -d $Reppou ]; then echo "$Reppou n'existe pas"; exit 1; fi find $Reppou -mtime +$NB -exec /bin/rm -i -r {} \; 2>/dev/null if [ `ls $Reppou | wc -l` -eq 0 ]; then rmdir $Reppou fi 3.2 a) et b) Je presente 2 solutions a partir d'options de la commande find. Le code pouvait se decomposer autrement : a vous de voir ce qui est propose. #!/bin/bash # case $# in 0)NB=30;; 1)NB=$1;; 2)NB=$1;; *)echo "usage: $0 [nombre-de-jours]"; exit 1;; esac Reppou=$HOME/.poubelle if [ ! -d $Reppou ]; then echo "$Reppou n'existe pas"; exit 1; fi #for i in `find $Reppou -mtime +$NB` for i in `find $Reppou -name "*" -type f -mtime +$NB` do echo $i if test `echo $i | grep "$2"` then echo "Trouve " $i #/bin/rm -i -r $i else echo "Pas trouve: $i" fi done if [ `ls $Reppou | wc -l` -eq 0 ]; then rmdir $Reppou fi #Ordinateur-de-Christophe-Cerin:~ cerin$ /bin/bash e.sh 1 txt #/Users/cerin/.poubelle/bio.txt #Trouve /Users/cerin/.poubelle/bio.txt #/Users/cerin/.poubelle/ControleCourt07032006Cor.txt #Trouve /Users/cerin/.poubelle/ControleCourt07032006Cor.txt #/Users/cerin/.poubelle/evalMichel.txt #Trouve /Users/cerin/.poubelle/evalMichel.txt #/Users/cerin/.poubelle/licPRO.txt #Trouve /Users/cerin/.poubelle/licPRO.txt #!/bin/bash # case $# in 0)NB=30;; 1)NB=$1;; 2)NB=$1;; *)echo "usage: $0 [nombre-de-jours]"; exit 1;; esac Reppou=$HOME/.poubelle if [ ! -d $Reppou ]; then echo "$Reppou n'existe pas"; exit 1; fi for i in `find $Reppou -name "*$2*" -mtime +$NB` do echo "Trouve: $i" done if [ `ls $Reppou | wc -l` -eq 0 ]; then rmdir $Reppou fi c) on utilise ici la commande tr et basename pour recupperer que le nom du fichier, sans le prefixe. La commande dirname est aussi utilisee. Le code pouvait se decomposer autrement : vefication sur la date ; verification sur le motif avec 2 commandes distinctes etc #!/bin/bash # case $# in 0)NB=30;; 1)NB=$1;; 2)NB=$1;; *)echo "usage: $0 [nombre-de-jours]"; exit 1;; esac Reppou=$HOME/.poubelle if [ ! -d $Reppou ]; then echo "$Reppou n'existe pas"; exit 1; fi for i in `find $Reppou -name "*$2*"` do echo $i if test `echo $i | grep "$2"` then UP=`basename $i| tr '[:lower:]' '[:upper:]'` UP=`dirname $i`/$UP echo $UP #/bin/rm -i -r $i else echo "Pas trouve: $i" fi done if [ `ls $Reppou | wc -l` -eq 0 ]; then rmdir $Reppou fi Ordinateur-de-Christophe-Cerin:~ cerin$ /bin/bash e1.sh 1 txt /Users/cerin/.poubelle/bio.txt /Users/cerin/.poubelle/BIO.TXT /Users/cerin/.poubelle/ControleCourt07032006Cor.txt /Users/cerin/.poubelle/CONTROLECOURT07032006COR.TXT /Users/cerin/.poubelle/evalMichel.txt /Users/cerin/.poubelle/EVALMICHEL.TXT /Users/cerin/.poubelle/licPRO.txt /Users/cerin/.poubelle/LICPRO.TXT Notes : voici plusieurs autres possibilités pour traiter les questions de l'exercice 3. find $Reppou -name $2 -mtime +$NB -exec /bin/rm -i -r {} \; 2>/dev/null Si $2 est une expression régulière, il y a dans find : find $Reppou -regex $2 -mtime +$NB -exec /bin/rm -i -r {} \; 2>/dev/null MAIS l'option -regex doit etre bien utilisée. Exemple: cerin@linux:~> find Documents/ -regex "*jpg*" cerin@linux:~> find Documents -regex "*jpg*" cerin@linux:~> find Documents -regex "*.jpg" cerin@linux:~> find Documents -regex "*.jpg" -print cerin@linux:~> alors qu'il y a des fichiers d'extension jpg dans le répertoire Documents ! Il ne faut pas oublier le . pour dire "n'importe quel caratère, eventuellement zero fois" : cerin@linux:~> find Documents -regex ".*jpg" -print Documents/TN_computer_126.jpg Documents/TN_computer_127.jpg Documents/TN_electronics_08C.jpg Retour sur la discussion précédente. Ou bien avec xargs : find $Reppou -mtime +$NB | grep $2 | xargs /bin/rm -i -r Ou bien à l'ancienne : /bin/rm -i -r `find $Reppou -mtime +$NB | grep $2 ` 3.2b et c Les solutions "à l'ancienne" marchent encore /bin/mv `find $Reppou -mtime +$NB | grep $2` ${Reppou}COPY /bin/mv `find $Reppou -mtime +$NB | grep $2 | tr "a-z" "A-Z"` ${Reppou}COPY (ou tr[ [:lower:] ] [ [:upper:] ] , plus dans le vent ...) A propos des options de find : l'option -name peut prendre une expression comprenant des classes (mais pas une expression régulière). Dans l'exemple ici, on recherche les noms des fichiers qui commencent par un digit, qui se poursuivent par n'importe quoi, puis un . puis un t, un x un t. cerin@linux:~> find Documents/ -name "[[:digit:]]*.txt" Documents/openclipart-0.17/tools/weapons/9_mm_gun_01.txt Documents/openclipart-0.17/unsorted/1989_chevrolet_celebrit_01.txt Documents/openclipart-0.17/unsorted/1989_chevrolet_celebrit_02.txt Documents/openclipart-0.17/computer/8port_hub_ruairi_hann_r.txt Documents/openclipart-0.17/computer/icons/70a001.txt Documents/openclipart-0.17/computer/icons/70a002.txt Ici on recherche 2 digits consecutifs et le fichier terminent par jpg cerin@linux:~> find Documents -regex ".*[0-9][0-9].*jpg" -print Documents/TN_SEG_100A.jpg Documents/TN_computer_24.jpg Documents/TN_SEG_105A.jpg Note : avec l'option -regex, il s'agit d'une correspondance sur le nom de fichier complet ainsi cerin@linux:~> find Documents -regex ".*[0-9].*jpg" -print retoune Documents/freevo-1.5.3/share/images/blurrsplash.jpg car il y a un digit dans le nom complet