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

83

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

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

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

Naftuli Kay
la source
Une question connexe: superuser.com/q/290986/11574
sampablokuper

Réponses:

108

Vous pouvez diriger tar vers la commande split:

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

Sur certains systèmes * nix (tels que OS X), le message d'erreur suivant peut s'afficher:

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 scinder un fichier pour l’adapter à un lecteur au format FAT32, utilisez une limite en octets de 4294967295. Par exemple:

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.
Jordan
la source
3
Génial! Comment puis-je extraire l'archive?
Naftuli Kay
24
Va cat sda1.backup.tar.gz.* | tar xzvf -faire le travail?
Naftuli Kay
3
Oui, ça devrait. splitpar défaut, définit les noms des fichiers de sorte que, une fois triés par LOCALE (ce qui est fait par le défilement du shell), ils seront dans le bon ordre.
Jordanie
4
Sans commentaire, juste faire tar czf ...sans vet fusionner cat backup.tar.gz.* | tar tar xzf - sans v. Je ne vois aucun avantage de la sortie verbeuse ici par v.
Léo Léopold Hertz 준영
1
Je viens d'aider un ami en plaçant Xcode sur un lecteur flash au format FAT32 avec: tar cvzf - Xcode.app/ | split -b 2000m - /Volumes/PH/xcode/xcode.tgz(utilisé depuis cd /Applications/) Merci beaucoup :)
ecth
13

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

$ tar cvzf - foo | split -b 2500m - foo.tgz.
Erik Allik
la source
4

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

split -b4294967295 -d my_input_file my_output_file_splitted
Aydin K.
la source
3
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"
Sergey Romanovsky
la source
Je n'ai pas voté contre votre réponse, parce que je suis heureux d'en voir une qui utilise -M --tape-length. Cependant, cette réponse ignore la demande de l'OP pour une solution utilisant la compression gzip ou bzip2.
sampablokuper
Attention: vous ne parlez pas tarmais plutôt d'un clone de tar appelé gtar(GNU tar). Ce clone tar prend en charge la création d'archives à plusieurs volumes, mais avec une probabilité notable, il est impossible / ne souhaite pas extraire de ces archives à plusieurs volumes car il affirme à tort qu'un volume de suivi n'est pas la partie de continuation appropriée.
Schily