Les archives

Vous avez été plusieurs à nous demander un article sur les différents formats d'archives et la manière de les utiliser. Il est vrai qu'il est facile de se perdre dans les suffixes tar, gz, tgz, bz2, Z, sans parler des termes généralement utilisés comme tarball ou gziped tarball ...

A l'époque où la Slackware était LA distribution à la mode, les formats d'archives étaient encore peu nombreux et un grand nombre de fichiers étaient des archives tar gzippées. Et voilà, ça recommence ... mais qu'est-ce que cela peut bien vouloir dire ? Faisons le tour de ces formats. Tout d'abord, il faut distinguer les utilitaires d'archivage des utilitaires de compression.

Les compresseurs

Sous ce terme vaguement français se cache un principe fort simple. Le contenu d'un fichier classique, disons du texte, possède certaines propriétés particulières. En effet, les caractères ou octets dont il se compose possèdent une diversité limitée. Ceci implique un certain nombre de répétitions des mêmes caractères avec une certaine fréquence plus ou moins aléatoire, l'entropie. Prenons un exemple simpliste et imaginons le texte suivant :

AAAABBBBBB

Ce texte occupe 10 caractères. Il est possible d'exprimer le même contenu de manière plus courte :

4A6B

Soit 4 fois "A" suivi de 6 fois "B". Notre texte compressé ne fait plus que quatre caractères. Voilà exactement le principe utilisé par les utilitaires de compression de fichiers, avec, bien sûr, des méthodes logiques et mathématiques bien plus complexes et puissantes. Pour être tout à fait précis, il est plus exact de parler d'encodage que de compression puisque le second terme n'est qu'une conséquence du premier. Voilà pourquoi les documentations (man pages) des utilitaires qui vont vous être présentés maintenant parlent de codage. Avec un système GNU, les utilitaires de compression les plus courants sont :

  • compress / uncompress
    Cet utilitaire déjà utilisé avec les toutes premières versions d'Unix utilise un algorithme de codage Lempel-Ziv adaptatif. Les archives générées sont facilement reconnaissables à leur extention .Z. A titre d'exemple, nous avons utilisé le fichier README livré avec les sources du noyau Linux 2.4.0. Ce fichier a une taille de 14151 octets :

    $ compress README
    

    Le fichier README.Z obtenu fait 7409 octets, soit à peu près la moitié de la taille d'origine. Pour décompresser, rien de plus simple :

    $ uncompress README.Z
    

  • gzip
    Voici l'un des deux compresseurs les plus courants sous GNU/Linux. Cet utilitaire issu tout droit du projet GNU s'utilise de la même manière que compress. Les fichiers générés portent habituellement l'extension .gz. On parle parfois de fichier gzippé (G zippé) ou gzipped en anglais. Les performances de gzip sont meilleures que celles de l'utilitaire précédent. Le même fichier README, une fois compressé, n'occupe plus que 6100 octets d'espace disque. gzip utilise également le codage Lempel-Ziv (LZ77).

  • bzip2 / bunzip2
    Ce petit utilitaire a créé l'événement il y a quelques temps grâce à ses performances. En effet, celui-ci utilisant un codage Huffman allié à un algorithme Burrows-Wheeler permet des résultats très intéressants. Notre fichier README voit ainsi passer sa taille de 14151 à seulement 5597 octets. Certes, le gain par rapport aux précédents utilitaires peut paraître minime à une telle échelle. Il en va tout autrement avec les sources d'un kernel, jugez vous-même :

    linux-2.4.3.tar.gz     25755214 octets
    linux-2.4.3.tar.bz2    20878683 octets
    

    Quasiment 5 Mo, le gain n'est plus du tout négligeable ! Les archives utilisant ce format de compression possèdent normalement une extension .bz2.

    gzip et bzip2 respectent les options classiques imposées par le plus ancien des utilitaires : compress. Voici quelques-unes de ces options :

    -d permet de décompresser une archive. Habituellement, les actions de compression et de décompression détruisent le fichier source. Ainsi, en décompressant le fichier README.gz, par exemple, vous obtenez un fichier README et perdez le fichier compressé.

    -c permet de rediriger le résultat de la compression ou de la décompression vers la sortie standard. Ceci peut être très intéressant dans le cas où vous désirez envoyer directement la sortie vers un autre utilitaire. Voici un exemple :

    $ gzip -d -c README.gz | less
    

    Ici, nous décompression (-d) le fichier README.gz sur la sortie standard (-c) et l'envoyons directement (|) à la commande less permettant de l'afficher. Résultat : nous pouvons parcourir le contenu du fichier en une seule commande.

    Les archiveurs

    Nous savons à présent compresser et décompresser des fichiers uniques. En effet, les utilitaires dont nous venons de parler ne permettent pas de réunir plusieurs fichiers dans une archive; ceci est la tâche d'un autre utilitaire très courant : GNU Tar ou tar pour les intimes.

    Tar est le Tape ARchiver, mais ne vous y trompez pas, tar n'est absolument pas limité aux cassettes et cartouches de sauvegarde. Gardez cependant à l'esprit cette image de cassette de sauvegarde car elle résume parfaitement le travail de l'utilitaire. En effet, tar se borne à ne faire qu'une seule chose : placer à la queue leu leu les données dans un gros fichier. Bien sûr, les noms de fichiers et leurs attributs sont également archivés. Attention : tar ne compresse pas les fichiers. Nous verrrons un peu plus loin comment utiliser tar et des utilitaires de compression de concert.

    Créer une archive tar est relativement simple. Placez-vous à l'endroit où sont vos fichiers à archiver et utilisez :

    $ tar c * > /endroit/archive.tar
    

    Voici sans doute la syntaxe la plus simple à utiliser avec tar. Tous les fichiers du répertoire ainsi que les sous répertoires s'y trouvant (*) sont archivés (c) et envoyés sur la sortie standard. Nous redirigeons (>) ensuite cette sortie vers un fichier. Si cela vous paraît un peu trop obscur, vous pouvez toujours préférer la syntaxe suivante !

    $ tar cf /endroit/archive.tar *
    

    Ici, nous précisons le fichier archive grâce à l'option f. Notez que les options peuvent également être spécifiées comme ceci :

    $ tar -c -f /endroit/archive.tar *
    

    Si vous désirez voir apparaître les noms des fichiers au fil de leur archivage, ajoutez simplement l'option v comme verbose (bavard). Pour désarchiver un fichier .tar, c'est l'option x qu'il vous faudra utiliser en lieu et place de c. A titre d'exemple, nous pouvons désarchiver notre archive .tar comme suit :

    $ tar xvf /endroit/archive.tar
    

    ou

    $ tar -x -v -f /endroit/archive.tar
    

    ou encore

    $ tar -f /endroit/archive.tar -v -x
    

    Si vous recevez une grosse archive contenant plusieurs dizaines ou centaines de fichiers, il serait très pénible de devoir désarchiver l'ensemble des fichiers si vous n'en avez besoin que d'un seul. Heureusement, tar a été correctement conçu et vous permet de lister les fichiers d'une archive :

    $ tar tf /endroit/archive.tar
    

    Ou, avec davantage d'informations (propriétaire/groupe, date, taille et attributs) :

    $ tar vtf /endroit/archive.tar
    

    Il ne vous restera ensuite plus qu'à extraire le fichier qui vous intéresse en précisant son nom :

    $ tar xvf /endroit/archive.tar lefichier
    

    En ce qui concerne les termes d'usage, les archives tar sont souvent appelées tarball.

    Combinaisons

    Nous voici arrivés au point le plus intéressant de l'article. Nous avons archivé des fichiers et compressé un. Nous pouvons donc combiner ces deux techniques pour créer et utiliser des archives compressées. La technique la plus simple pour lire une archive compressée est de procéder en deux étapes :

  • Tout d'abord, nous décompressons l'archive avec l'utilitaire adéquat.

    $ gzip -d archive.tar.gz
    $ bzip2 -d archive.tar.bz2
    $ uncompress -d archive.tar.Z
    

  • Il nous suffit ensuite de lister ou extraire les fichier de l'archive.

    $ tar tf archive.tar
    

    Il est cependant possible de faire plus court en utilisant l'option -c des utilitaires de compression. En effet, nous pouvons rediriger la sortie de l'utilitaire de décompression vers l'entrée de tar. Cela nécessite l'utilisation d'une option particulière de tar le "-". Ce tiret symbolise l'entrée standard en tant que fichier. Voici quelques exemples :

    $ gzip -d -c archive.tar.gz | tar tf -
    

    Nous permet de décompresser archive.tar.gz et d'envoyer le résultat vers tar. Le - symbolise le flux de données en provenance de gzip. Nous listons les fichiers contenus dans archive.tar.gz

    $ bzip2 -d -c archive.tar.gz | tar xvf -
    

    Ici, nous procédons de même avec bzip2, mais cette fois nous désarchivons les fichiers.

    $ gzip -d -c archive.tar.gz | tar xf - README -O | less
    
    Plus complexe cette fois puisque nous utilisons une seconde redirection. Notre fichier archive.tar.gz est décompressé et envoyé sur la sortie standard; de là, tar prend le relais et extrait du flux de données le fichier README présent dans l'archive. Mais au lieu de l'inscrire dans le répertoire courant, nous l'envoyons sur la sortie standard avec l'option -O. Enfin, nous "branchons" less sur la sortie standard pour parcourir le fichier README à l'écran.

    Est-il possible de faire plus court ? Oui. L'utilisation de tar avec un compresseur est tellement courante que tar donne la possibilité de faire usage d'un compresseur par l'intermédiaire d'une simple option. Ainsi :

    $ tar xvzf archive.tar.gz
    

    est équivalent à

    $ gzip -d -c archive.tar.gz | tar xf -
    

    C'est l'option z qui précise alors que tar doit faire traiter l'archive par gzip avant extraction. Pour bzip2, ca donne :

    $ tar xvjf archive.tar.bz2
    

    Enfin, pour compress, nous utilisons l'option courte Z de cette manière :

    $ tar xvZf archive.tar.Z
    

    Note : Les extensions .tgz correspondent à des archives .tar.gz. L'extension a simplement été réduite afin de permettre un support pour des systèmes de fichiers peu performants, comme FAT, n'utilisant que trois caractères maximum pour les extensions.

    L'utilisation la plus courante est sans conteste la décompression / extraction, mais il peut arriver également que vous ayez à créer de telles archives compressées :

    $ tar c * | gzip -c archive.tar.gz
    
    ou

    $ tar cvzf archive.tar.gz dossier/
    $ tar cvjf archive.tar.bz2 dossier/
    

    Nous voilà arrivés au terme de cet article. J'espère que les explications qui ont été données vous permettront de vous faciliter la vie avec vos archives et vos fichiers compressés.

    Liens

    Gnu Tar
    http://www.gnu.org/software/tar/
    http://www.gnu.org/manual/tar/

    Gzip
    http://www.gnu.org/software/gzip/

    Bzip2
    http://sources.redhat.com/bzip2/

    Linux Magazine France n°28 - Mai 2001