Table des matières
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 :
<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èresASCII
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 (oustdin
si l’on ne précise pas de nom) et écrit la version encodée sur la sortie standardstdout
. Le paramètrenom
précise le nom du fichier pour le décodage paruudecode
.uudecode [fichier]
: Décode un fichier encodé paruuencode
. Si l’argument fichier n’est pas spécifié,uudecode
litstdin
. Le nom du fichier résultat est précisé dans le codage (paramètrenom
deuuencode
).
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.
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édersplitter.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.