web-dev-qa-db-fra.com

Créer une archive tar divisée en blocs d'une taille maximale

J'ai besoin de sauvegarder un répertoire assez volumineux, mais je suis limité par la taille des fichiers individuels. Je voudrais essentiellement créer une archive tar.(gz|bz2) qui est divisée en 200 Mo maximum d'archives. Clonezilla fait quelque chose de similaire en divisant les sauvegardes d'images nommées ainsi:

sda1.backup.tar.gz.aa
sda1.backup.tar.gz.ab
sda1.backup.tar.gz.ac

Existe-t-il un moyen de le faire en une seule commande? Je comprends comment utiliser la commande split, mais je ne voudrais pas avoir à créer une archive géante, puis la diviser en archives plus petites, car cela doublerait l'espace disque dont j'avais besoin pour initialement créer l'archive.

90
Naftuli Kay

Vous pouvez rediriger tar vers la commande split:

tar cvzf - dir/ | split --bytes=200MB - sda1.backup.tar.gz.

Sur certains systèmes * nix (comme OS X), vous pouvez obtenir l'erreur suivante:

split: illegal option -- -

Dans ce cas, essayez ceci (notez le -b 200m):

tar cvzf - dir/ | split -b 200m - sda1.backup.tar.gz.

Si vous essayez de fractionner un fichier pour qu'il tienne sur un lecteur au format FAT32, utilisez une limite d'octets de 4294967295. Par exemple:

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.
118
jordanm

Sur macOS, la commande split fonctionne légèrement différemment:

$ tar cvzf - foo | split -b 2500m - foo.tgz.
14
Erik Kaplun

Juste pour ajouter: comme la taille de fichier maximale autorisée dans vfat/fat32 est de 2 ^ 32 moins 1 (4294967295 octets), la commande de division avec la taille de fichier maximale autorisée sur un tel système de fichiers est:

split -b4294967295 -d my_input_file my_output_file_splitted
5
Aydin K.
serega@serega-sv:~$ tar -c  -M --tape-length=1024 --file /tmp/pseudo-tape.tar --new-volume-script=/tmp/new-volume.sh --volno-file=/tmp/volno /tmp/stuff-to-archive 
tar: Removing leading `/' from member names
moving /tmp/pseudo-tape.tar to /tmp/archive.1
moving /tmp/pseudo-tape.tar to /tmp/archive.2
moving /tmp/pseudo-tape.tar to /tmp/archive.3

Vous aurez besoin d'un script pour automatiser le déplacement du fichier pseudo-tape.tar vers un nouveau nom:

serega@serega-sv:~$ cat /tmp/new-volume.sh 
dir="/tmp"
base_name="pseudo-tape.tar"
next_volume_name=`echo -n "archive."; cat $dir/volno`
echo "moving $dir/$base_name to $dir/$next_volume_name"
mv "$dir/$base_name" "$dir/$next_volume_name"
3
Sergey Romanovsky