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 tar
en 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 -acl
est 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 Utils
est composé de deux composants principaux :
-
xz
l’outil de compression similaire àgzip
, -
liblzma
, une librairie logicielle comparablezlib
Différentes commandes raccourcies existent comme :
-
lzma
(pourxz --format=lzma
) -
unxz
(pourxz --decompress; analogous to gunzip
) -
xzcat
(pourunxz --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