Outils pour utilisateurs

Outils du site


tp4

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
tp4 [2019/01/22 13:01] – created gillestp4 [2019/01/22 14:17] (Version actuelle) gilles
Ligne 1: Ligne 1:
-====== TP 3 : Archivage ======+====== Archivage ======
  
-===== Durée =====+Le but de ce TP est de développer est d'expérimenter la redirection //en-place// et de mettre au point un outil d'agrégation de fichiers et de dossiers en vue de construire un utilitaire d'archivage. Les archives que vous aller construire devront être exécutables et auto-désarchivables. Cet //archiveur// sera écrit en ''bash''-script. Vous progresserez par paliers. **Un conseil : Pensez à travailler dans un dossier dédié lors de la mise au point de votre TP (e.g. ''archiver'')**.
  
-6 heures+==== Introduction à la redirection //en-place// ====
  
-===== Archivage =====+Parmi les principes généraux des ''bash''-scripts se trouve notamment le principe de consommation des données sur l'entrée standard - i.e. le clavier par défaut - et de restitution du résultat sur la sortie standard - i.e. le terminal par défaut. La redirection "//en-place//" permet de faire en sortes que le contenu du ''bash''-script en cours d'exécution devienne l'entrée standard courante d'une commande. La syntaxe générale de cette redirection est la suivante : 
  
-Le but de ce TP est de développer un outil d'agrégation de plusieurs fichiers sous la forme d'archive. Par ailleurs, les archives que vous aller construire devront être exécutables et auto-désarchivables. Cet //archiver// sera écrit en ''bash''-script. Vous progresserez par paliers. Vous travaillerez dans un répertoire de votre compte nommé ''se1/tp2''. 
- 
-==== Sujet ==== 
- 
-La redirection "//en-place//" permet de faire en sorte que le contenu du //shell-script// en cours d'éxécution devienne l'entrée standard courante d'une commande. La syntaxe à utiliser est la suivante : 
 <code> <code>
-commande << TAG_DE_FIN+commande << TAG_ENCADREMENT
 ... ...
 ... Ici se trouve l'entrée standard de 'commande' ... ... Ici se trouve l'entrée standard de 'commande' ...
 ... ...
-TAG_DE_FIN+TAG_ENCADREMENT
 </code> </code>
 +
 +Ainsi ''commande'' substitue son entrée standard par défaut (i.e. le clavier) par les lignes étant encadrées par la séquence ''TAG_ENCADREMENT''.
  
 A titre d'exemple, et sachant que ''wc -l'' compte le nombre de lignes venant de ''stdin'' tapez la commande suivante : A titre d'exemple, et sachant que ''wc -l'' compte le nombre de lignes venant de ''stdin'' tapez la commande suivante :
 +
 <code> <code>
 wc -l << TAG_WC wc -l << TAG_WC
Ligne 32: Ligne 30:
 </code> </code>
  
-Vous pouvez renouveller l'expérience avec la commande :+Vous pouvez renouveler l'expérience avec la commande : 
 <code> <code>
 cat << TAG_CAT cat << TAG_CAT
Ligne 39: Ligne 38:
 </code> </code>
  
-  - En vous basant sur l'exemple précédent, tapez la commande à l'invite shell permettant de créer le fichier ''my-id.txt'' et contenant votre nom, votre prénom ainsi que votre adresse mail. Chacune des informations doit être sur une ligne différente. Vous n'avez donc pas le droit d'utiliser la commande ''echo''+==== Q.1 Compréhension ==== 
-  Insérez cette commande dans un script-shell nommé ''my-ball.sh''Lancez ''my-ball.sh'' pour vous assurez de son bon fonctionnement. + 
-  - Toujours en suivant la même démarche, écrivez un script-shell nommé ''create-ball.sh'' qui aura pour objectif de créer ''my-ball.sh'' (avec les droits d'exécution adéquat)  +Quel sera le résultat de la commande suivante ? 
-    Vous venez de créer un script ''A'' qui génére un script ''B''. Lorsque ''B'' s'éxécute, il crée à son tour un fichier ''C''. ''B'' est donc une archive auto-décompactable. ''A'' est un archiveur. Le fichier ''C'' est généré à partir de l'archive ''B''//A est create-ball.sh////B est my-ball.sh//, //C est my-id.txt//+ 
-  Effacez ''my-id.txt''. Lancer la commande ''my-ball.sh''. Elle génère ''my-id.txt''. Copiez ''my-id.txt'' en ''my-id2.txt''. Editez ''my-id2.txt'' et ajoutez-y votre date de naissance et votre lieu de naissance.  +<code> 
-  Modifiez ''create-ball.sh'' afin qu'il accepte un nom de fichier en paramètre. L'archive ''my-ball.sh'' générée aura pour objectif de recréer le fichier passé en paramètre. Vous testerez votre script ''create-ball.sh'' avec les fichiers ''my-id.txt'' et ''my-id2.txt''. Attention à préserver les droits d'accès lors du désarchivage. +wc -l << TAG_WC > wcf 
-  - Modifiez ''create-ball.sh'' afin qu'il admette plusieurs fichiers en paramètre. L'archive créée ''my-ball.sh'', recréera l'ensemble des fichiers en paramètres lors de son exécution+l1 : azerty 
-  - Faites en sorte que ''create-ball.sh'' soit en mesure d'archiver (et de désarchiver) des fichiers binaires. +l2 : uiop 
-  Apportez à votre archiver la fonctionnalité d'archivage d'une branche de l'arborescence+l3 : qsdfg 
 +l4 : hjklm 
 +l5 : wxcvv 
 +l6 : bn 
 +TAG_WC 
 +</code> 
 + 
 +En vous basant sur ces exemples, tapez la commande à l'invite shell permettant de créer un fichier nommé ''my-id.txt'' contenant votre nom, votre prénom ainsi que votre adresse mail. Chacune des informations doit être sur une ligne différente. **A NOTER : Vous n'avez pas le droit d'utiliser la commande ''echo''**
 + 
 +==== Q.2 Première redirection //en-place// ==== 
 + 
 +En partant des réponses faites à la question 1, c'est-à-dire en utilisant la redirection //en-place// écrivez un ''bash''-script nommé ''my-ball.sh'' qui crée le fichier ''my-id.txt'' avec les même informations que précédemmentExécutez ''my-ball.sh'' pour vous assurez de son bon fonctionnement. 
 + 
 +==== Q.3 Prémisses d'un archiveur ... ==== 
 + 
 +Toujours en suivant la même démarche que précédemment, écrivez un ''bash''-script nommé ''create-ball.sh'' qui crée automatiquement ''my-ball.sh''. ''create-ball.sh'' s'assurera que ''my-ball.sh''les droits d'exécution. Bien entendu, l'exécution de ''my-ball.sh'' doit toujours générer ''my-id.txt''
 + 
 +Vous venez de créer un script ''A'' (''create-ball.sh''qui génère un script ''B'' (''my-ball.sh''). Lorsque ''B'' s'exécute, il crée à son tour un fichier ''C'' (''my-id.txt''). Par conséquent, ''B'' est une archive auto-décompactable. ''A'' est un archiveur. Le fichier ''C'' est généré à partir de l'archive ''B''Pour vous en assurer, effacez le fichier ''my-id.txt''ré-exécutez ''my-ball.sh''. Le fichier ''my-id.txt'' a été recréé
 + 
 +==== Q.4 Gestion d'un paramètre ==== 
 + 
 +Si ''my-id.txt'' n'est pas présent dans votre dossier, régénérez-le par l'exécution de ''my-ball.sh''. Copiez ''my-id.txt'' sous un nouveau nom : ''my-id-bis.txt''. Editez ''my-id-bis.txt'' et ajoutez à la fin de ce fichier votre date de naissance et votre lieu de naissance. 
 + 
 +Modifiez ''create-ball.sh'' afin qu'il accepte un nom de fichier en paramètre. L'existence de ce fichier devra être vérifiée. L'archive ''my-ball.sh'' générée a maintenant pour objectif de recréer le fichier passé en paramètre. Vous testerez votre nouveau ''bash''-script ''create-ball.sh'' avec les fichiers ''my-id.txt'' et ''my-id-bis.txt''. Attention à préserver les droits d'accès lors du désarchivage. Pour le vérifier, vous pouvez, à titre d'exemple, le faire à l'aide des séquences suivantes : 
 + 
 +<code bash> 
 +  $> ls 
 +  my-id.txt my-id-bis.txt 
 +   
 +  $> cat my-id.txt 
 +  marcel michu 
 +  marcmich@monurl.perso 
 +   
 +  $> cat my-id-bis.txt 
 +  marcel michu 
 +  marcmich@monurl.perso 
 +  29 février 2000 
 +  Arnac-la-Poste (Haute-Vienne) 
 +   
 +  $> create-ball.sh my-id-bis.txt 
 +  $> rm my-id-bis.txt 
 +   
 +  $> ls  
 +  my-id.txt my-ball.sh 
 +   
 +  $> ./my-ball.sh 
 +  $> ls 
 +  my-id.txt my-id-bis.txt my-ball.sh 
 +   
 +  $> cat my-id-bis.txt 
 +  marcel michu 
 +  marcmich@monurl.perso 
 +  29 février 2000 
 +  Arnac-la-Poste (Haute-Vienne) 
 +<code> 
 + 
 +==== Q.5 - Gestion de plusieurs paramètres ==== 
 + 
 +Modifiez ''create-ball.sh'' afin qu'il admette plusieurs nom de fichiers en paramètre. L'archive créée ''my-ball.sh'', récrée au cours de son exécution, l'ensemble des fichiers passés en paramètre. 
 + 
 +==== Q.6 - Fichiers binaires ==== 
 + 
 +Jusqu'à maintenant notre archiveur ne fonctionne qu'avec des fichiers //texte// c'est-à-dire dont l'encodage est restreint à une certaine plage de valeurs de la table ''ASCII''. On souhaite maintenant faire en sortes que ''create-ball.sh'' fonctionne avec tout types de fichiers, y compris binaire. A l'instar de la question 4 du TP //splitter//, nous avons à notre disposition les commandes ''UNIX'' - qui sont également des filtres - suivantes. 
 + 
 +  * ''uuencode/uudecode'' 
 +        * ''uuencode -m [fichier] nom'' : est utilisé pour encoder un fichier en n’utilisant que des caractères ''ASCII'' 7 bits (codes entre 0 et 127), par exemple pour le transmettre sur un réseau ne transmettant que les 7 bits de poids faible. ''uuencode'' lit le fichier (ou ''stdin'' si l’on ne précise pas de nom) et écrit la version encodée sur la sortie standard ''stdout''. Le paramètre ''nom'' précise le nom du fichier pour le décodage par ''uudecode''
 +        * ''uudecode [fichier]'' : Décode un fichier encodé par ''uuencode''. Si l’argument fichier n’est pas spécifié, ''uudecode'' lit ''stdin''. Le nom du fichier résultat est précisé dans le codage (paramètre ''nom'' de ''uuencode''). 
 + 
 +Faites en sorte que ''create-ball.sh'' soit en mesure d'archiver (et de désarchiver) des fichiers binaires. Vous pourrez par exemple tester sur les 2 images ci-dessous
 + 
 +{{ :upjv.png?300 | UPJV}} 
 +{{ :logomis-coul.png?300 | MIS}} 
 + 
 +==== Q.7 - Gestion de l'arborescence ==== 
 + 
 +En vous basant sur les réponses aux questions 4, 5, et 6 du TP //Gestion de corbeille//, apportez à ''création-ball.sh'' la capacité de traiter un nombre variable de paramètres d'une part, et l'archivage de branches complètes de l'arborescence d'autre part. 
 + 
 +==== Q.8 - Splitter "auto-mergeable" (facultatif) ==== 
 + 
 +Repartez de la solution que vous proposez à l'issue du TP //splitter// pour faire en sortes que : 
 + 
 +  * ''splitter.sh'' génère des blocs << auto-fusionnables >>. Ainsi le premier bloc généré est exécutable, vérifie la présence des autres blocs, et reconstruit - sans nécessité de posséder ''splitter.sh'' - l'ensemble du fichier originel. 
 + 
 +  * Intégrez cette nouvelle fonctionnalité de ''splitter.sh'' à votre archiveur qui en plus de générer des archives auto-désarchivables gère également le partitionnement de ses archives et leur fusion automatique. 
tp4.1548162098.txt.gz · Dernière modification : 2019/01/22 13:01 de gilles