Comment créer une archive tar fractionnée en plusieurs étapes pour économiser de l'espace?
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
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
tar
se 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";read
ou vous pouvez même effectuer le transfert à partir de celui-ci (renommer le volume, car une fois que vous quittez /tmp/volume.tar
sera é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:
tar
vous demandera le nouveau volume. Une fois que vous appuyez sur Entrée, /path/to/transferred.volume
il s'ouvre à nouveau, et ainsi de suite.
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"