Académique Documents
Professionnel Documents
Culture Documents
2018-2019
ET DE GESTION DE KAIROUAN
DÉPARTEMENT INFORMATIQUE
Système d’exploitation
1.1. Description
Lorsque je travaille dans un terminal, certains répertoires reviennent très
souvent. C'est par exemple le cas de mon dossier personnel. Le shell
offre un raccourci pour se déplacer dans le dossier personnel : la
commande cd sans argument.
Je ne peux par contre pas sauvegarder d'autre répertoires "favoris" pour
pouvoir m'y déplacer facilement.
1.2. Objectif
L'objectif de ce mini projet est de créer un petit système de "favoris" pour
vos répertoires importants.
Votre script devra fournir 4 fonctions :
S (Save) pour sauvegarder un nouveau favori. Cette fonction prend un
argument (une chaine sans espace) et ajoute le répertoire courant dans votre
liste de favoris.
C (Change) pour se déplacer dans un répertoire favori. Cette fonction prend
un argument (un chaine sans espace) et cherche dans vos favoris. Si le favori
existe, la fonction change le répertoire de travail, sinon, elle ne fait rien.
R (Remove) pour supprimer un favori de la liste.
L (List) pour afficher la liste de tous les favoris.
Exemple d'utilisation
$ source favoris.sh
$ pwd
/home/hyvernat/info202/TP/sujets/TP5
-1-
$ S info202-5
$ cd
$ pwd
/home/hyvernat/
$ C info202-5
$ pwd
/home/hyvernat/info202/TP/sujets/TP5
$ R info202-5
$ cd
$ C info202-5
1.3. Précisions
-2-
Note : la variable HOME contient le chemin absolu vers votre dossier
personnel...
Manipulation du fichier
Pour manipuler le fichiers de favoris, il faudra utiliser les choses
suivantes.
La commande grep qui permet d'afficher les lignes contenant une chaine de
caractères donnée. Remarque, si on veut imposer que la chaine cherchée se
trouve en début de ligne, on peut la préfixer par le symbole ^ :
o grep "abc" donne toutes les lignes qui contiennent abc,
o grep "^abc" donne toutes les lignes qui commencent par abc.
-3-
2. Mini projet 2 : gérer une "TODO list"
2.1. Description
Pour éviter d'oublier des choses importantes à faire, je voudrais garder
une une liste dans mon ordinateur. J'aimerais pouvoir ajouter des tâches,
les lister, et en supprimer.
Remarque: je pourrais également utiliser cette fonctionnalité pour
garder :
une liste de films à voir,
la liste des livres que j'ai prêtés,
etc.
2.2. Objectif
Le script doit fournir une unique fonction todo qui offre 3 fonctionnalités :
lister les tâches en attente
supprimer une tâche
ajouter une tâche
$ source todo.sh
$ todo list
1 - finir TP d'info202
2 - téléphoner à tata
$ todo done 1
$ todo list
1 - téléphoner à tata
-4-
$ todo add 2 réviser la chimie
$ todo list
1 - téléphoner à tata
2 - réviser la chimie
2.3. Précisions
Votre fonction devra analyser son premier argument afin de décider
quelle opération effectuer. Il faudra donc se reporter à la
section arguments individuels d'une fonction et la description
des conditionnelles.
Manipulation du fichier
Pour manipuler les tâches, il faudra utiliser les choses suivantes.
La commande nl permet d'afficher les lignes d'un fichier, en ajoutant un
numéro de ligne. Il est possible d'ajouter un séparateur entre le numéro et la
ligne si vous le souhaitez (voir man nl pour les détails).
pour ajouter une tache en position n, il faudra :
o rediriger les n-1 premières taches dans un fichier temporaire avec la
commande head et une redirection >,
o ajouter la tache dans le fichier temporaire avec une commande echo et
une redirection >>,
o les tâches à partir de la numéro n dans le fichier temporaire avec la
commande tail et une redirection >>,
-5-
o remplacer le fichiers des tâches par le fichier temporaire.
3.1. Description
J'aimerais bien avoir des statistiques sur mes fichiers :
taille totale occupée
taille occupée par les fichiers / répertoires cachés
nombres de petits (moins de 512kio) et gros fichiers (plus de 15Mio)
nombre de fichiers et répertoires vides (qui peuvent probablement être
supprimés)
nombres de fichiers Python, ou html, etc.
...
3.2. Objectif
Le script devra fournir une fonction qui analyse le contenu du répertoire
courant et de ses sous-répertoires et afficher des statistiques. La
quantité de détails dépendra de la valeur de l'argument donné à la
fonction :
1 (ou pas d'argument) : peu de détails
2 : un peu plus de détails
3 : beaucoup de détails
-6-
$ pwd
/home/hyvernat/info202/
$ statistiques
Analyse de /home/hyvernat/info202/ :
- 45 répertoires
- 114 fichiers
$ statistiques 2
Analyse de /home/hyvernat/info202/ :
- 45 répertoires
- 1 répertoire caché
- 0 répertoire vide
- 3 fichiers cachés
- 1 fichier vide
$ statistiques 3
Analyse de /home/hyvernat/info202/ :
- 45 répertoires
- 1 répertoire caché
- 0 répertoire vide
-7-
- 3 fichiers cachés
- 1 fichier vide
/home/hyvernat/info202/CM1/Img/RAM_old-
plane_4k.jpg
Il y a :
- 5 fichiers Python
- 17 fichiers image
- 0 fichier vidéo
3.3. Précisions
L'ingrédient principal de cette fonction sera la commande find et des
redirections CMD1 | CMD2. Vous pouvez vous reporter aux sections
pertinentes dans la liste des commandes du shell.
Il n'est pas nécessaire d'écrire des boucles pour cette fonction : chaque
information peut être calculée directement avec une commande shell.
Par exemple, voila une manière simple de compter le nombre de
répertoires vides :
-8-
3.4. Pour aller plus loin
vous pouvez ajoutez d'autres niveaux de détails,
vous pouvez ajouter des options pour choisir individuellement les
informations affichées,
etc.
4.1. Description
J'ai quelques photos que je souhaite partager facilement sur ma page
Internet. J'aimerais générer une petite page HTML qui affiche des petites
vignettes. Un clic sur une de ces vignette devra afficher la photo
originale...
4.2. Objectif
La fonction devra prendre une liste de fichiers images en arguments et
générer des vignettes de taille 128 pixels par 128 pixels
générer une page HTML pour afficher ces vignettes
chacune de ces vignettes sera un lien vers l'image originale
$ source ./galerie.sh
$ galerie *.???
-9-
4.3. Précisions
Vous pouvez utiliser les photos de cette archive (prises sur Wikipedia)
pour tester votre fonction.
Il va falloir faire des boucles sur les arguments d'une fonction.
1.Pour générer une vignette, on peut utiliser la commande
-10-
3.Laisser le choix de la taille des vignettes à l'utilisateur.
4.etc.
5.1. Description
Les photos prises par mon téléphone ont des noms pas très
jolis : IMG_20160312_124305306.jpg, etc.. Pour les archiver, j'aimerais
les renommer en WeekEnd_2016-02-12_16-35-12.jpg, WeekEnd_2016-
02-12_16-36-24.jpg, etc.
5.2. Objectif
Dans l'exemple précédent, c'est l'utilisateur qui choisit explicitement le
préfixe WeekEnd. La date et l'heure sont automatiquement ajoutées au
nom de fichier.
Voici un exemple d'utilisation :
$ source ./renomme.sh
$ ls *.jpg
$ ls *.jpg
Lac_2015-08-30_16-52-52.jpg Lac_2015-08-30_16-53-27.jpg
Lac_2015-09-04_16-34-07.jpg
5.3. Précisions
Vous pouvez utiliser les photos de cette archive (prises sur Wikipedia)
pour tester votre fonction.
Reportez vous aux sections
conditionnelles en shell
Informations EXIF
-11-
Commandes cut et tr
6.1. Description
La galerie photo de mon téléphone Android affiche les photos par date
de modification des fichiers. Lors de la restauration d'une sauvegarde,
les fichiers sont recréés et les photos sont donc affichées dans le
désordre.
Comme la date de prise de la photo se trouve dans le fichier (données
"EXIF"), j'aimerais écrire un script pour remettre de l'ordre dans tout ça.
6.2. Objectif
Il s'agit d'écrire une fonction shell qui prend une liste de fichiers en
arguments et change la date de modification de chacun de ces fichiers
en fonction des informations EXIF (Exchangeable image file format).
Si ces informations ne sont pas présentes, les méta-données des fichier
ne sont pas modifiées.
Voici un exemple d'exécution :
$ source maj_dates.sh
$ ls -tr *.jpg
-12-
Belledonne_soleil.jpg Belledonne.jpg Bauges_Mont_Blanc.jpg
Bauges_Belledonnes.jpg Bauges.jpg
$ maj_dates *.jpg
Fin de la fonction
$ ls -tr *.jpg
6.3. Précisions
Vous pouvez utiliser les photos de cette archive (prises sur Wikipedia)
pour tester votre fonction.
Commencez par lire les sections suivantes :
Informations EXIF
Changer la date de modification d'un fichier
La date présente dans les données EXIF n'est pas au même format que celle
acceptée par la commande touch. Les commandes cut et tr peuvent être
utiles : commandes cut et tr
-13-
Compléments sur le shell
Fonctions shell
Un script shell est un petit programme écrit dans le langage du shell.
C'est un fichier contenant des commandes et des constructions similaires
à celles trouvées dans les langages de programmation plus "évolués".
La première ligne d'un tel fichier doit être
#!/bin/bash
afin que le système le reconnaisse comme script shell.
On peut définir une fonction dans un script bash de la manière suivante :
function test() {
CMD1
CMD2
CMD3
...
}
Cela permet d'ajouter une commande : une fois que le fichier est lu par le
shell, par exemple par
$ source FICHIER
$ source FICHIER
-14-
Pour utiliser la valeur d'une variable, il faut précéder son nom du signe $
echo "La valeur de var est $var"
Pour initialiser une variable avec le résultat d'une autre commande, il faut
utiliser
var=$(CMD)
où CMD est la commande à exécuter.
conditionnelles
Pour faire des instructions conditionnelles, on peut utiliser un if. La syntaxe
est
if [ TEST ]
then
...
elif [ TEST ]
then
...
elif [ TEST ]
then
...
else
...
fi
Attention, les espaces sont obligatoires après le symbole [ et avant le
symbole ] !
TEST est une condition, qui porte en général sur des variables :
-z "$var" pour tester si la variable est vide ou non,
-f "$var" pour tester si la variable contient un nom de fichier qui
existe,
"$var" == "hello" pour tester si la variable contient la chaine hello,
etc.
$ man test
-15-
> do
> done
animal : chat
animal : chien
animal : souris
function animaux() {
for a in "$@"
do
echo "animal : $a"
done
echo "FIN de la fonction"
}
alors l'exécution donne
$ source script.sh
animal : chat
animal : chien
animal : chauve
animal : souris
animal : canard
FIN de la fonction
$ animaux
FIN de la fonction
-16-
Arguments individuels d'une fonction
Comme expliqué dans la section boucle sur les arguments d'une
fonction, la liste des arguments d'une fonction est appelée $@.
Pour accéder aux premiers arguments individuellement, il faut utiliser les
variables $1, $2, ... $9.
Pour accéder aux arguments suivants (après le numéro 9), il faut
"décaler" les arguments. La commande shift supprime le premier
argument et décale les suivants. Ainsi, après un shift, la
variable $1 contient l'argument numéro 2, etc.
Par exemple, si le fichier args.sh contient
#!/bin/bash
function montre_args() {
echo "Tous les arguments : $@"
echo "Argument 1: $1"
shift
echo "Autres arguments : $@"
}
on aura
$ source ./args.sh
Argument 1: ananas
1 + 2
-17-
On peut utiliser des variables, et stocker le résultat dans une variable:
$ V=117
$ V=$(( $V / 2 ))
la valeur de V est 58
$ $((1 + 2))
Commande touch
La commande touch permet de modifier la date de dernier accès et date
de dernière modification d'un fichier :
$ ls -l examen.pdf
-18-
-rw-r--r-- 1 hyvernat hyvernat 114087 2009-02-13 23:31:30
examen.pdf
$ touch examen.pdf
Commandes cut et tr
La commande tr permet de modifier certains caractères, ou d'en
supprimer. Cette commande agit sur l'entrée standard :
pour changer des caractères on donne simplement deux chaines
girAffE
girff
World
-19-
echo "b0,62,bf" | cut -d"," -f1,3
b0,bf
Commande file
La commande file essaie de deviner le type des fichiers donnés en
argument :
tmp: empty
TP4: directory
-20-
$ file -bi test.py log tmp TP4 Lac.jpg
text/x-python; charset=us-ascii
text/plain; charset=us-ascii
inode/x-empty; charset=binary
inode/directory; charset=binary
image/jpeg; charset=binary
La commande du
La commande du (disk usage) prend une liste de fichiers en argument et
affiche la taille occupée (en Kio) par chaque fichier. L'option -c permet
d'afficher également l'espace total utilisé par les fichiers et l'option -
h permet d'afficher un taille en utilisant des unités "raisonnables" (k, M,
G).
Par exemple :
56K cours.html
2.2M 2I010_2016_support.pdf
12K survie.pdf
12K t.pdf
2.3M total
Informations EXIF
Les données EXIF peuvent contenir de nombreuses informations
renseignées par l'appareil photo :
date de prise
localisation de la photo (si l'appareil est équipé d'un GPS)
-21-
temps d'exposition
flash
...
$ exiftool Bauges.jpg
...
...
Flash : No Flash
...
2011:08:11 12:41:02.00$
-22-
o créer un alias pour la commande
o $ alias
exiftool="CHEMIN/Image-ExifTool-10.50/exiftool"
-23-