Comment créer une archive tar fractionnée en plusieurs étapes pour économiser de l'espace?

Jan 08 2021

J'ai un très grand dossier dont j'essaye de créer une archive tar. Le problème est que je n'ai pas assez d'espace libre supplémentaire pour stocker l'intégralité de l'archive.Je veux donc créer, disons, des morceaux de 100 à 200 Go de l'archive à la fois et les transférer individuellement vers le stockage en nuage. Je dois être en mesure de contrôler quand de nouveaux morceaux sont créés pour que mon disque dur ne se remplisse pas, mais toutes les commandes que j'ai trouvées pour créer des archives tar scindées le créent toujours en même temps, dans le même répertoire.

La solution la plus proche que j'ai trouvée provenait de cette question, mais toutes les réponses basent les archives sur le nombre de fichiers, et non sur la taille, ce qui est important pour mon cas d'utilisation, car mes tailles de fichiers sont inégalement réparties.

Réponses

2 EduardoTrápani Jan 08 2021 at 10:09

Vous pouvez utiliser tar, avec ces options:

--new-volume-script=COMMAND
--tape-length=N

A la fin de chaque volume il appellera votre script, qui aura quelques variables d'environnement pour savoir quel volume vient d'être traité. Consultez la page de manuel pour la liste complète, mais au moins la variable TAR_VOLUME est assez utile, au cas où vous deviez renommer le fichier de sortie, ou garder une trace du volume actuel:

TAR_VOLUME Numéro d'ordre du volume que tar est en cours de traitement (défini en cas de lecture d'une archive multi-volume).

Si le retour du script 0 tarse poursuit, sinon il s'arrêtera.

Par exemple, cela créera chaque volume, d'une taille maximale de 20M, en appelant votre script à chaque fois que la limite est atteinte:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=/path/to/myscript.sh --tape-length=20M

Le script peut être simple echo "Next volume";readou vous pouvez même effectuer le transfert à partir de celui-ci (renommer le volume, car une fois que vous quittez /tmp/volume.tarsera écrasé).

De l'autre côté, veillez à utiliser l'indicateur --multi-volume. Si vous ne le faites pas, tar s'arrêtera avec les erreurs (je le laisse au cas où quelqu'un chercherait l'erreur):

tar: EOF inattendu dans l'archive

tar: l'erreur n'est pas récupérable: sortie maintenant

tar xvf /path/to/transferred.volume --multi-volume

Préparez le volume # 2 pour /path/to/transferred.volume et appuyez sur return:

tarvous demandera le nouveau volume. Une fois que vous appuyez sur Entrée, /path/to/transferred.volumeil s'ouvre à nouveau, et ainsi de suite.

1 JoshHarrison Jan 09 2021 at 01:30

Suite à l' excellente réponse d' eduardo-trápani, voici une version légèrement modifiée d'un script trouvé sur la page GNU qui attend l'entrée de l'utilisateur pour chaque volume et réessaye si un volume n'est pas trouvé:

Par souci d'exhaustivité, voici la commande utilisée pour créer l'archive:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=./myscript.sh --tape-length=1000M

Et voici la commande que j'ai utilisée pour extraire l'archive fractionnée:

tar xvf /tmp/volume.tar --multi-volume --new-volume-script=./myscript.sh

myscript.sh:

#!/bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.

echo "Press enter to continue to next volume"

read

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.

name=`expr $TAR_ARCHIVE : '\(.*\)-.*'` case $TAR_SUBCOMMAND in
-c)       ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || echo "Failed to find volume" ;; *) exit 1 esac echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

Edit: Cela ne fonctionne qu'avec GNU Tar qui peut être installé sur macOS (avec Homebrew) par:

brew install gnu-tar

Pour l'utiliser comme tar par défaut, vous devrez l'ajouter à votre chemin comme suit:

export PATH="$(brew --prefix)/opt/python/libexec/bin:$PATH"