Archivage et compression

Ce chapitre présente différents outils d’archivage et de compression des fichiers :

  • tar/untar
  • gzip/gunzip
  • bzip2/bunzip2
  • xz/unxz
  • zip/unzip
  • zcat, cpio/pax (pas étudiés ici)

1. Définitions

  • Compression : Réduire la taille d’un fichier par algorithme de compression.
  • Archivage : Placer un ensemble de fichiers et/ou de dossiers dans un seul fichier.
  • Compression sans archivage : gzip/gunzip, bzip2/bunzip2
  • Archivage avec ou sans compression : tar, star

1.1. Création d’un dossier de travail

Veuillez créer un dossier de travail dans votre dossier personnel :

mkdir archivage
cd archivage

1.2. Création de fichier

Exercice

Création de quelques fichiers à la volée :

for i in 0 1 2 3 4 5 6 7 8 9 ; do echo "mon_fichier$i" > mon_fichier$i ; done

Exercice

De manière plus élégante :

for ((i=0;i<10;i=i+1)) ; do echo "mon_fichier$i" > mon_fichier$i ; done

Exercice

Ou alors, probablement plus efficace :

for i in {0..9} ; do echo "mon_fichier$i" > mon_fichier$i ; done

Exercice

Si on désire des fichiers avec un certain poids et du contenu texte compressible, la commande yes imprime une ligne tant que la taille du fichier n’a pas atteint 100KB :

for i in {0..9} ; do
  yes texte quelconque | head -c 100KB > mon_fichier$i
done

2. Compression gzip/gunzip

L’utilitaire gzip est basé sur l’algorithme Deflate (combinaison des algorithmes LZ77 et Huffman). C’est la méthode de compression la plus populaire sous GNU/Linux.

Compresser un fichier (le fichier est remplacé par son format compressé) :

gzip mon_fichier0
ls -lh

2.1. Décompresser un fichier gzippé

Décompresser un fichier gzippé :

gunzip mon_fichier0.gz
ls -lah

ou bien

gzip -d mon_fichier0.gz

2.2. Compresser un fichier de façon optimisée

Compresser un fichier de façon optimisée :

gzip -9 mon_fichier0

2.3. Compresser plusieurs fichiers en un seul

Compresser plusieurs fichiers en un :

gzip -c mon_fichier1 mon_fichier2 > mon_fichier_compresse.gz

3. Compression bzip2

bzip2 est une alternative à gzip, plus efficace mais moins rapide.

sudo yum install -y bzip2

3.1. Compresser un fichier en bzip2

Compresser un fichier :

bzip2 mon_fichier0

3.2. Décompresser un fichier bzippé

Décompresser un fichier bzippé :

bunzip2 mon_fichier0.bz2

ou encore :

bzip2 -d mon_fichier0

4. Commande tar

Tar (« tape archiver », en français « archiveur pour bande », son rôle à l’origine) est le programme d’archivage de fichiers le plus populaire sous GNU/Linux et les systèmes Unix. Il est généralement installé par défaut. On peut ajouter à une archive tar différents algorithmes de compression. On notera également que tar préserve les permissions et les propriétaires des fichiers, ainsi que les liens symboliques.

Les programmes cpio et pax peuvent aussi créer des archives en utilisant des redirections (< | >).

star fonctionne de la manière que taren supportant les ACLs.

4.1. tar : archivage sans compression

Les principales options de tar sont les suivantes et peuvent se combiner à souhait :

  • c / x : construit / extrait l’archive ;
  • v : mode bavard ;
  • f : utilise le fichier donné en paramètre.

Exercice : archiver plusieurs fichiers ou un dossier

Pour archiver plusieurs fichiers ou un dossier, la commande est la même :

tar cvf mon_archive.tar mon_fichier1 mon_fichier2
tar cvf usr_share_doc.tar /usr/share/doc

Exercice : extraire une archive tar

Pour extraire une archive tar, tapez :

tar xvf mon_archive.tar

4.2.tar : archivage avec compression

Tar peut archiver en utilisant des algorithmes de compression, afin d’avoir des archives moins volumineuses. Par habitude, on suffixe les archives avec un . suivi d’une extension de compression. Il suffit pour cela d’ajouter à la commande tar une option de compression :

  • z : compression Gunzip
  • j : compression Bzip2

Exercice : archiver et compresser un dossier avec Gunzip

Pour archiver et compresser un dossier avec Gunzip, tapez :

tar cvzf usr_share_doc.tar /usr/share/doc

Exercice : extraire une archive tar.gz

Pour extraire une archive tar.gz, tapez :

tar xvzf usr_share_doc.tar

Exercice : extraire une archive Bzip2

De même pour Bzip2 :

tar cvjf usr_share_doc.tar.bz2 /usr/share/doc
tar xvjf usr_share_doc.tar.bz2

4.3. star

Le logiciel star est l’équivalent de tar avec le support des ACLs.

yum -y install star

Si l’option -aclest choisie les ACLs sont sauvegardées en mode création et restaurées en mode extraction.

5. XZ

XZ Utils (anciennement LZMA Utils) est un ensemble d’outils de compression en ligne de commande compressient LZMA et xz.

XZ Utilsest composé de deux composants principaux :

  • xz l’outil de compression similaire à gzip,
  • liblzma, une librairie logicielle comparable zlib

Différentes commandes raccourcies existent comme :

  • lzma (pour xz --format=lzma)
  • unxz (pour xz --decompress; analogous to gunzip)
  • xzcat (pour unxz --stdout; analogous to zcat)

La compression par défaut est xz

5.1. Compresser une archive XZ

Compresser une archive :

xz   my_archive.tar    # results in my_archive.tar.xz
lzma my_archive.tar    # results in my_archive.tar.lzma

5.2. Décompresser une archive XZ

Décompresser l’archive :

unxz    my_archive.tar.xz      # results in my_archive.tar
unlzma  my_archive.tar.lzma    # results in my_archive.tar

5.3. Créer une archive XZ et la compresser

Créer une archive et la compresser :

tar -c --xz   -f my_archive.tar.xz   /some_directory    # results in my_archive.tar.xz
tar -c --lzma -f my_archive.tar.lzma /some_directory    # results in my_archive.tar.lzma

5.4. Décompresser une archive XZ et extraire son contenu

Décompresser une archive et extraire son contenu :

tar -x --xz   -f my_archive.tar.xz      # results in /some_directory
tar -x --lzma -f my_archive.tar.lzma    # results in /some_directory

6. ZIP

ZIP est un vieux format d’archive, mais aussi celui d’une commande pour créer ce type d’archive.

On utilise alors les commandes zip et unzip.

sudo yum install -y zip

6.1. Création ZIP

zip votre_archive.zip [liste des fichiers]
zip -r votre_archive.zip [dossier]

Exercice

zip mon_archive.zip mon_fichier1 mon_fichier2
zip -r usr_share_doc.zip /usr/share/doc

Afin de compresser plusieurs sous-dossiers séparément :

for f in /usr/share/doc/* ; do zip -r ${f##*/}.zip ${f}/* ; done

6.2. Chiffrement ZIP

zip -e votre_archive.zip [liste des fichiers] chiffre le zip et demande un mot de passe.

6.3. Extraction unzip

sudo yum install -y unzip

Exercice

unzip mon_archive.zip -d mon_repertoire

Extraction de plusieurs fichiers .zip d’un même dossier :

for f in *.zip ; do unzip "$f" ; done

6.4. Archives zip découpées

Quelques fois les archives zip sont découpées comme suit : archive.z01, archive.z02, …, archive.zip. Il faut rassembler les fichiers dans une seule archive, puis extraire cette dernière :

cat archive.z* > archive_globale.zip
unzip archive_globale.zip

7. Exercices

7.1. Exercice 1

Avec des droits privilégiés, veuillez créer une archive compressée du dossier de chaque utilisateur (/home) dont le nom contiendra le nom de l’utilisateur et un horodatage. Veuillez placer cette archive dans le dossier préalablement créé /opt/archives. Veuillez valider ces archives en les décompressant dans un sous-dossier du nom de l’archive dans /opt/archives.

L’exercice consiste à fournir deux lignes de commande avec zip ou tar : l’une pour la création de l’archive et l’autre pour la validation de l’archive.

Autrement dit, si l’archive s’appelle francois_2021-05-24-111919.zip, le dossier de destination pour la validation sera /opt/archives/francois_2021-05-24-111919.

Bonus : ajoutez un test avant l’extraction de l’archive.

7.2. Solution 1 avec zip/unzip

mkdir /opt/archives

Création des archives

for username in /home/* ; do
  zip -r /opt/archives/${username##*/}_$(date +%Y-%m-%d-%H%M%S).zip ${username}
done

La variable ${username} vient de la liste des dossiers contenus dans /home. La valeur de la variable contient le chemin absolu de l’utilisateur d’ou la suppression de tous les caractères dans la variable jusqu’au dernier / dans le motif ${username##*/}.

Validation des archives

for username in /home/* ; do
  for file in /opt/archives/${username##*/}*.zip ; do
  unzip -o ${file} -d ${file/.zip/}
  done
done

Ici on trouve une boucle imbriquée (une double boucle) : la première qui identifie le nom d’un utilisateur et la seconde qui traite chaque nom de fichier d’archive dans le dossier /opt/archives/. Le motif ${file/.zip/} dans la variable de la seconde boucle supprime l’occurence .zip.

Test dans la validation

for username in /home/* ; do
  for file in /opt/archives/${username##*/}*.zip ; do
    if unzip -qq -t ${file} ; then
      unzip -qq -o ${file} -d ${file/.zip/}
      echo "Decompressed ${file}"
    else
      echo "Bad ${file}"
    fi
  done
done

7.3. Solution 1 avec tar

Création des archives

for username in /home/* ; do \
  tar cfvz /opt/archives/${username##*/}_$(date +%Y-%m-%d-%H%M%S).tgz ${username}/*
done

Validation des archives

for username in /home/* ; do
  for file in /opt/archives/${username##*/}*.tgz ; do
  mkdir -p ${file/.tgz/}
  tar xfvz ${file} -C ${file/.tgz/}
  done
done

Test dans la validation

for username in /home/* ; do
  for file in /opt/archives/${username##*/}*.tgz ; do
    if gunzip -t ${file} 2> /dev/null ; then
      mkdir -p ${file/.tgz/}
      tar xfvz ${file} -C ${file/.tgz/}
      echo "Decompressed ${file}"
    else
      echo "Bad ${file}"
    fi
  done
done

8. Autres logiciels

La curiosité nous invite à consulter les résultats des commandes de recherche de paquets avec le terme “backup” :

sudo apt search backup || sudo yum search backup