Tuesday, November 5, 2013

La programmation en shell - 2

 Exercice 1 :

�crivez le script "rename" permettant de renommer un ensemble de fichiers. Par
exemple rename �.c� �.bak� aura pour effet de renommer tous les fichiers
d�extension .c en .bak. les fichiers f1.c et f2.c deviennent f1.bak et f2.bak.
Utilisez la commande basename.

Solution :

#!/bin/bash
# Si ce script a pour nom : rename
# rename .c .bak
# fait ce que DOS fait en : rename *.c *.bak
#
if [ $# ne 2 ] ;then
echo "invoque par rename '.c' '.bak'"
exit 0
fi
for i in *$1 ; do
mv $i $(basename $i $1)$2
done

Exercice 2 :


Et si vi gardait une copie de secours ?
vi est un peu d�licat � ma�triser au d�but, et si on sort par :wq apr�s avoir fait une
gaffe, tout est perdu. Ecrivez donc un petit script en Bash qui cr�e une copie de
secours. Appelons le svi, pour Safe VI. La commande svi fich1 devra invoquer
vi fich1, mais laisser derri�re elle un fichier fich1.bak contenant la version
d�origine de fich1.
Pensez aux deux cas suivants :
Si je dis : svi tralala et que tralala n�existe pas?
Si je dis : svi fich1.bak, que se passe-t-il?

Solution :

#!/bin/bash
# ce script doit etre invoque avec un seul argument
# svi fich
case $# in # Doit etre invoque avec un seul argument.
1) if [[ $1 != *.bak ]] ; then # vix fich1.bak ouvre
# fich1.bak en lecture seule
if [ ! s $1 ] ; then # si fich1 n'existe pas,
vi $1 # on le cree
exit
fi
if [ f $1 ] ; then # si fich1 est un nom
cp $1 $1.bak # de fichier on sauvegarde
if [ $? != 0 ] ; then # et on verifie
echo "Erreur : impossible de creer $1.bak" >2
exit 1
else
vi $1
exit
fi
else
echo "Erreur : $1 n\'est pas un fichier" >2
exit 1
fi
else
echo "ATTENTION : $1 est ouvert en lecture seule"
sleep 3
vi R $1
exit
fi;;
*) echo "Erreur : svi fichier" >2
exit 2;;
esac

Exercice 3 :

L�espace disque est pr�cieux ! Une id�e pour �conomiser : Ecrire un script qui
recherche dans toute mon arborescence tous les fichiers qui n�ont pas �t� acc�d�s
depuis un temps T et dont la taille est sup�rieure a MIN, et les comprimer par l�utilitaire
gzip. T et MIN sont des constantes d�finies au d�but du script par des valeurs
judicieusement choisies. Au fait, a quoi sert MIN ?
Un tel script pourrait �tre lanc� une fois par semaine.

Solution :

#!/bin/bash
# Pour lancer ce script une fois par semaine, (cron)
# voir corrige de l'exercice 12.6.1
# Les constantes T et MIN sont definies par des variables
typeset T=15 # Plus de 16 jours.
typeset i MIN=4096 # 4096 octets = 1 bloc pour AIX
# Il est inutile de comprimer un fichier dont la taille
# est inferieure a un bloc : il occupera toujours un
# bloc sur le disque (voir chapitre 10)
cd
for i in $(find . type f atime +$T size +$MINc print)
do
gzip $i
done

Exercice 4 :

�crire un script dont le nom est process permettant de copier dans un tableau la liste
des processus de l�utilisateur ex�cutant ce script, puis afficher le nom de chaque
processus.

Solution :

#!/bin/bash
# ce script a pour nom process.
# Il montre l'utilisation de la substitution de commande
# et des tableaux.
# Ce script affiche les noms de vos processus.
# exemple: xstra> process
#
declare i i=7
declare i fin
declare a PROCESSTAB
PROCESSTAB=($(ps u $(id u)))
FIN=${#PROCESSTAB[*]}
until [ $i gt $FIN ] ;do
echo "programme=${PROCESSTAB[$i]}"
i=$i+4
done

No comments:

Post a Comment