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
Suivant
« Précédent
Précédent
Suivant »

ConversionConversion EmoticonEmoticon

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.