Université Paris-Est Créteil Énoncés L3 SPI parcours Électronique session déc. 2015 Examen de TP Introduction aux systèmes d exploitation Durée : 3h Documents et notes de cours autorisés. Ne répondez pas à plusieurs questions en même temps ; respectez le découpage de l énoncé, sous peine de nullité. Certaines questions sont plus faciles que d autres, lisez bien l énoncé avant de commencer. Gestion de photos et vidéos en bash On se propose d écrire un script bash gererphotos.sh qui permet de gérer des répertoires contenant des photos (chiers d extension.jpg) et des vidéos (.mp4). Au départ, on suppose que l on a des photos et des vidéos, regroupées par jour dans un certain nombre de répertoires "$SOURCE/annee_mois_jour/" où $SOURCE est par défaut "$HOME/Images/" et année, mois et jour sont nnés sur respectivement 4, 2 et 2 chiffres (exemple : 2015_04_25). De plus, chaque nom de chier contenu dans l un de ces répertoires est unique. Le but du script est de déplacer les chiers en les regroupant par mois et non par jour, et de séparer les photos des vidéos. Ainsi, la destination d un chier photo (respectivement vidéo) initialement situé dans le répertoire "$SOURCE/annee_mois_jour/" sera le répertoire "$PHOTOS/annee_mois/" (respectivement "$VIDEOS/annee_mois/"). Par défaut, $PHOTOS est "$HOME/Photos/", $VIDEOS est "$HOME/Videos/". Exercice 1 (1 point) Écrire une fonction afcherusage qui afche l usage du script sous la forme suivante : USAGE:./gererphotos.sh [options] Options : -help : afche cette aide -src rep : change répertoire source -dp rep : change répertoire cible des photos -dv rep : change répertoire cible des vidéos Exercice 2 (2 points) Écrire une fonction testerarguments qui reçoit deux entiers en argument. Si le premier argument est numériquement plus petit que le second, la fonction afche "Argument manquant" sur la sortie d erreur, puis termine le script en échec en retournant 1. Exercice 3 (3 points) Écrire la première partie du programme principal, qui initialise les trois variables SOURCE, PHOTOS et VIDEOS à leur valeur par défaut (voir début de l énoncé), puis analyse la ligne de commande (voir usage dans l exercice 1). Selon les options rencontrées, soit on afche l usage et on termine le script en succès, soit on modie l une ou l autre des trois variables (dans ce cas on vérie avec testerarguments qu il y a au moins deux arguments). Si l option est inconnue, on afche un message d erreur et on termine le script en échec. Les options peuvent apparaitre dans un ordre quelconque, voire plusieurs fois. Exercice 4 (2 points) Écrire une fonction creerrepertoire qui reçoit un nom de répertoire en argument. Si ce répertoire existe, la fonction ne fait rien, sinon elle afche son intention de créer le répertoire, puis le crée. Si cette création échoue, elle afche un message d erreur et termine le script en échec en retournant 1. 1
Exercice 5 (2 points) Écrire une fonction extrairedeligne qui ne reçoit pas d arguments, mais lit trois mots dans une ligne sur l entrée standard. Si les trois mots sont tous non vides, la fonction afche sur une seule ligne le mot 1 puis le caractère "_" puis le mot 2, sinon la fonction afche une ligne vide. Exercice 6 (2 points) Écrire une fonction extraireduchemin qui reçoit en argument un chemin de répertoire sous la forme "chemin/annee_mois_jour" puis afche sur la sortie standard "annee_mois" (sinon afche une ligne vide). Une solution consiste à extraire le nom du sous-répertoire avec la commande basename, puis de transformer les "_" en " " (espace) avec la commande tr, pour enn appeler extrairedeligne. On rappelle que la commande basename prend un chemin en argument puis afche le nom du chier ou sous-répertoire dans ce chemin. Par exemple, basename /usr/local/bin afche bin. Exercice 7 (4 points) Écrire une fonction rangerrepertoire qui reçoit en premier argument le chemin d un répertoire source, de la forme "chemin/annee_mois_jour", et en deuxième argument le sous-répertoire destination de la forme "annee_mois". La fonction itère sur chaque chier du répertoire source. Si le chier courant n est pas un chier régulier, on va à la prochaine itération. Selon l extension du chier, on le déplace dans le répertoire "$PHOTOS/annee_mois/" ou "$VIDEOS/annee_mois/" ou sinon on va à la prochaine itération. Avant de déplacer un chier dans un répertoire, on appelle creerrepertoire pour éventuellement le créer, puis on afche le chemin source et le chemin destination du chier pour informer l utilisateur. Si un déplacement échoue, on ignore l erreur. Exercice 8 (2 points) Écrire une fonction gestiondesreps qui ne reçoit pas d argument. La fonction itère sur chaque sousrépertoire de $SOURCE, calcule le nom du sous-répertoire cible avec extraireduchemin, puis si le résultat est non vide, range le contenu du sous-répertoire courant dans les répertoires cibles correspondants avec rangerrepertoire. Exercice 9 (2 points) Écrire la seconde partie du programme principal : si le répertoire $SOURCE n existe pas, on afche un message d erreur et on termine le script en échec ; on crée éventuellement les répertoires $PHOTOS et $VIDEOS avec creerrepertoire ; enn on range les photos et vidéos avec gestiondesreps. 2
Université Paris-Est Créteil Corrections L3 SPI parcours Électronique session déc. 2015 Examen de TP Introduction aux systèmes d exploitation Durée : 3h Correction 1 afcherusage () echo "USAGE: $0 [options]" echo "Options : -help : afche cette aide" echo " -src rep : change répertoire source" echo " -dp rep : change répertoire cible des photos" echo " -dv rep : change répertoire cible des vidéos" Correction 2 testerargument () if [ "$1" -lt "$2" ]; echo "Argument manquant" 1>&2 Correction 3 #! /bin/bash # Analyse ligne de commande SOURCE="$HOME/Images" PHOTOS="$HOME/Photos" VIDEOS="$HOME/Videos" while [ $# -gt 0 ] case "$1" in -help) afcherusage ; exit 0 ;; -src) testerarguments $# 2 ; SOURCE="$2" ; shift 2 ;; -dp) testerarguments $# 2 ; PHOTOS="$2" ; shift 2 ;; -dv) testerarguments $# 2 ; VIDEOS="$2" ; shift 2 ;; *) echo "ERREUR de syntaxe" 1>&2 ; exit 0 ;; esac 1
Correction 4 creerrepertoire () if [! -d "$1" ] echo "Création répertoire \"$1\"..." if [! mkdir "$1" ] echo "Echec création répertoire \"$1\"" 1>&2 Correction 5 extrairedeligne () read a m j if [ "$a" = "" -o "$m" = "" -o "$j" = "" ] echo "" else echo "$a_$m" # on protège $a de $a_ avec Correction 6 extraireduchemin () basename "$1" tr _ " " extrairedeligne Correction 7 rangerrepertoire () for f in "$1"/* # Est-ce un chier? if [! -f "$f" ]; continue ; case "$f" in *.jpg) d="$photos" ;; *.mp4) d="$videos" ;; *) continue ;; esac creerrepertoire "$d/$2" b=$(basename "$f") g="$d/$2/$b" 2
echo "\"$f\" --> \"$g\"" mv "$f" "$g" Correction 8 gestiondesreps () for rep in "$SOURCE"/* # Est-ce un répertoire? if [! -d "$rep" ]; continue ; # calcul répertoire cible d=$(extraireduchemin "$rep") if [ "$d" = "" ]; continue ; rangerrepertoire "$rep" "$d" Correction 9 # Existence de RepSrc if [! -d "$SOURCE" ] echo "Erreur, répertoire source inexistant" 1>&2 # Création éventuelle des répertoires creerrepertoire "$PHOTOS" creerrepertoire "$VIDEOS" # Déplacement photos et videos gestiondesreps exit 0 3