Compresser, découper et envoyer des fichiers volumineux sous Linux
Connexion en carton mousse

Envoyer des fichier volumineux au travers d’une petite connexion internet peu s’avérer compliqué. Cet article liste les quelques outils nécessaires et les commandes utiles à l’accomplissement de cette tâche.

Xz - Compresser un fichier

Xz est un outil de compression très performant. Pour compresser un gros fichier avec le taux de compression maximal on utilise simplement :

xz -9 gros_fichier

Le fichier de sortie sera nommé gros_fichier.xz

Split - Découper un fichier en plusieurs fichiers de taille définie

Découper le fichier en plusieurs fragments de 1GB (-b bytes) et ajouter un suffixe numérique aux fichiers de sortie (-d )

split -b 1024M  -d gros_fichier.xz  gros_fichier.xz_part
donnera :

gros_fichier.xz_part01
gros_fichier.xz_part02
gros_fichier.xz_part03
...

Combiner tar + xz-utils + split

A titre d’exemple, le même résultat que précédement, en utilisant conjointement tar et split :

tar -Jcvf - un_repertoire_ou_fichier | split -d -b 1024MB - gros_fichier.tar.xz.

Tmux - Envoyer les fichiers en tâche de fond

Pour envoyer les fichiers vers un serveur, j’utilise scp avec une clef ssh et comme je ne veux pas saturer la connexion j’utilise l’option -l (limit). Dans l’exemple ci-dessous, -l 512 correspond à environ 50ko/s.

scp -i ~/.ssh/ma_clef  -l 512 gros_fichier.xz_part* user@host:/home/bob/incoming

C’est bien joli, mais si je fais des transferts à distance, j’aimerais bien lancer la commande en tâche de fond, surtout si l’upload est très long.
Pour ce faire, j’utilise tmux qui permet d’utiliser plusieurs terminaux virtuel que l’on peu détacher ou rattacher au terminal facilement.

tmux new-session -d -s upload  'scp -i ~/.ssh/ma_clef  -l 512 gros_fichier.xz_part* user@host:/home/bob/incoming 2> errors.log'

Rattacher le terminal pour voir l’upload en cours : tmux attach
Détacher le terminal avec la combinaison de touches ctrl + b puis d
Grâce à tmux, je peux me déconnecter du shell distant et revenir plus tard...
Un simple tmux a me permettra de consulter l’état d’avancement de l’upload.

Cat - Réassembler les fichiers découpés

Une fois les fichiers transférés, je les réassemble avec un simple cat

cat gros_fichier.xz_part*   >  gros_fichier.xz

Décompression d’un xz ou d’un tar.xz

Avec tar (-x xtract) :
tar -Jxvf gros_fichier.tar.xz

Avec xz-utils (-d)
xz -d gros_fichier.xz

Voilà.