Prochaine révision | Révision précédente |
tp2 [2019/01/14 09:58] – created gilles | tp2 [2019/01/17 13:05] (Version actuelle) – gilles |
---|
===== Splitter de fichiers ===== | ====== Splitter de fichiers ====== |
| |
Durée : 4 heures | Durée : 4 heures |
---- | ---- |
| |
===== Q1. Diviser un fichier texte en 2 parties ===== | ===== Q.1 - Diviser un fichier texte en 2 parties ===== |
| |
* A l'aide de la commande ''wc'' et des commandes ''head'' et ''tail'', proposez un script ''split-2.sh'' qui permet la division d'un **fichier texte** passé en paramètre en deux parties de taille égales (le plus possible au moins). Le nom du fichier texte a diviser sera passé en paramètre (y compris avec une arborescence). Le préfixe des fichiers issus de la division sera le nom du fichier source. Les extensions des deux fichiers seront respectivement ''.sp1'' et ''.sp2'' | * A l'aide de la commande ''wc'' et des commandes ''head'' et ''tail'', proposez un script ''split-2.sh'' qui permet la division d'un **fichier texte** passé en paramètre en deux parties de taille égales (le plus possible au moins). Le nom du fichier texte a diviser sera passé en paramètre (y compris avec une arborescence). Le préfixe des fichiers issus de la division sera le nom du fichier source. Les extensions des deux fichiers seront respectivement ''.sp1'' et ''.sp2'' |
---- | ---- |
| |
===== Q2. Reformer un fichier qui a été diviser en 2 parties ===== | ===== Q.2 - Reformer un fichier qui a été divisé en 2 parties ===== |
| |
| |
| |
---- | ---- |
| |
| ===== Q.3 - En N parties équivalentes ===== |
| |
| * Copiez et modifiez ''split-2.sh'' afin de construire le script ''split-n.sh'' permettant le partage - en parties de tailles équivalentes - d'un fichier passé en paramètre. Le nombre de divisions ''N'' sera passé en paramètre du script ''split-n.sh''. Cette valeur ''N'' sera stockée en première ligne de la série de fichiers de partage avec le nom du fichier original. |
| * Copiez et modifiez ''group-2.sh'' afin de construire le script ''group-n.sh'' permettant la fusion des fichiers de partage. Sur la première ligne du premier fichier de partage se trouve ''N'', le nombre de parties et le nom du fichier original. La valeur ''N'' récupérée permettra de vérifier si l'ensemble des fichiers nécessaires à la reconstruction sont fournis. Le nom du fichier original permettra de recomposer sous le même nom qu'à l'origine. En conséquence, ''group-n.sh'' ne prend qu'un seul paramètre : le préfixe des fichiers à recomposer. |
| |
| |
| ---- |
| |
| ===== Q.4 - Pour tous types de fichiers ===== |
| |
* ''uuencode/uudecode'' | * ''uuencode/uudecode'' |
* ''uuencode [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''. | * ''uuencode [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''). | * ''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''). |
* Afin de vous exercer, réalisez un uuencodage d'un fichier de votre choix. Choisissez par exemple le fichier ''vi-ref.pdf'' disponible en annexe de la page du module de système d'exploitation. | * Afin de vous exercer, réalisez un uuencodage d'un fichier de votre choix. Choisissez par exemple le fichier ''vi-ref.pdf'' disponible en annexe de la page du module de système d'exploitation. Faite également l'expérience avec un fichier d'image de type ''.jpg''. |
* On souhaite maintenant traiter les fichiers de nature binaire en plus des fichiers ''ASCII''. Utilisez ''uuencode'' et ''uudecode'' pour adapter ''split-2.sh'' dans ce but. Modifiez ''group-2.sh'' en conséquence. | |
* **Keys** : ''uuencode'', ''uudecode'', ''head'', ''tail'', ''cat'', ''wc'' | |
- A partir de ''split-2.sh'' et ''group-2.sh'', construisez ''splitter.sh''. ''splitter.sh'' admettra un paramètre supplémentaire indiquant un nombre variable de parties issues de la division. La division devra se faire à part égales. Lorsque ce paramètre ne sera pas un nombre mais l'option ''-d'' ou ''-g'', ''splitter.sh'' procède à la reconstruction du fichier qui lui est passé en paramètre (qui est un préfixe dans ce cas). | |
* **Keys** : ''uuencode'', ''uudecode'', ''wc'', ''cat'', ''let'', redirection de ''stdout'' | |
| |
| * A partir de ''split-n.sh'' et ''group-n.sh'', construisez ''splitter.sh''. ''splitter.sh'' qui permet désormais de traiter tous types de fichiers y compris les fichiers binaires (en plus des fichiers ''ASCII''). Pour cela vous utiliserez ''uuencode'' et ''uudecode''. En plus des options issues des questions précédentes, ''splitter.sh'' assurera aussi bien la division que la fusion grâce respectivement aux options ''-d'' et ''-g''. |
| * **Keys** : ''uuencode'', ''uudecode'', ''head'', ''tail'', ''cat'', ''wc'', ''let'', redirection de ''stdout'', ... |
| |
---- | <code bash> |
| Exemple : |
| |
| $> ./splitter.sh -d 6 /tmp/maphoto.jpg |
| $> ls |
| maphoto.sp1 maphoto.sp2 maphoto.sp3 |
| maphoto.sp4 maphoto.sp5 maphoto.sp6 |
| $> for i in maphoto.sp* |
| > do |
| > mv $i toto.`echo $i | cut -d . -f 2` |
| > done |
| $> ls |
| toto.sp1 toto.sp2 toto.sp3 |
| toto.sp4 toto.sp5 toto.sp6 |
| $> ./splitter.sh toto |
| $> ls |
| toto.sp1 toto.sp2 toto.sp3 |
| toto.sp4 toto.sp5 toto.sp6 |
| maphoto.jpg |
| $> rm toto.sp3 maphoto.jpg |
| $> ls |
| toto.sp1 toto.sp2 |
| toto.sp4 toto.sp5 toto.sp6 |
| $> ./splitter.sh toto |
| ERROR : Cannot merge prefix 'toto' |
| </code> |
| |
| ---- |