====== Archivage ====== 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'')**. ==== Introduction à la redirection //en-place// ==== 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 : commande << TAG_ENCADREMENT ... ... Ici se trouve l'entrée standard de 'commande' ... ... TAG_ENCADREMENT 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 : wc -l << TAG_WC l1 : azerty l2 : uiop l3 : qsdfg l4 : hjklm l5 : wxcvv l6 : bn TAG_WC Vous pouvez renouveler l'expérience avec la commande : cat << TAG_CAT Ceci est un message TAG_CAT ==== Q.1 - Compréhension ==== Quel sera le résultat de la commande suivante ? wc -l << TAG_WC > wcf l1 : azerty l2 : uiop l3 : qsdfg l4 : hjklm l5 : wxcvv l6 : bn TAG_WC 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édemment. Exé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'' a 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 : $> 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) ==== 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.