Comment créer une archive tar divisée en plusieurs fichiers ou s'étendant sur plusieurs fichiers?

27

Selon cette page , on peut laisser tar créer une archive tar "divisée" en fichiers de 100 Mo:

tar -c -M --tape-length = 102400 --file = disk1.tar largefile.tgz

Le problème est que cette commande vous demandera de donner de manière interactive un nouveau nom de fichier pour le fichier suivant, une fois le premier fichier rempli.

Quelqu'un connaît un moyen de sauter cette étape interactive et de laisser tar faire le "fractionnement" automatiquement?

Samuel Lampa
la source
Lié à cela: unix.stackexchange.com/q/61774/6860
sampablokuper

Réponses:

20

Jetez un oeil à l' --new-volume-scriptoption, qui vous permet de remplacer le mécanisme d'invite par un mécanisme différent ou par un nom de fichier généré. ( (tar.info)Multi-Volume Archivesdans la tarpage d'informations.) Le problème avec splitest que vous avez besoin de catremettre les morceaux ensemble pour faire quoi que ce soit, alors qu'une archive multivolume devrait être un peu plus flexible.

geekosaure
la source
C'est vrai, bien sûr.
Eduardo I.
2
Merci, c'est ce que je cherchais! J'ai maintenant découvert qu'il y avait en fait quelques instructions (y compris un exemple) disponibles ici: gnu.org/software/tar/manual/tar.html#Using-Multiple-Tapes
Samuel Lampa
Le problème avec cela est qu'il est excessivement absurde et favorise le contraire des applications de style Unix appropriées.
Jan Kyu Peblik
33

Vous pouvez utiliser split pour cela:

tar czpvf - /path/to/archive | split -d -b 100M - tardisk

Cela indique à tar d'envoyer les données à stdout et de les séparer pour les récupérer dans stdin - en plus en utilisant un suffixe numérique ( -d), une taille de bloc ( -b) de 100M et en utilisant 'tardisk' comme base pour les noms de fichiers résultants (tardisk00, tardisk01, tardisk02, etc.).

Pour extraire les données par la suite, vous pouvez utiliser ceci:

cat tardisk* | tar xzpvf -
Eduardo I.
la source
1
Petite correction, -dconcerne le suffixe numérique, pas le préfixe.
yclian
8

Bien sûr, la meilleure option à utiliser est l' --new-volume-scriptoption.

Mais, si vous connaissez la taille du fichier (dans ce cas, largefile.tgz), vous pouvez également le faire:

tar -c -M -L 102400 --file=disk1.tar --file=disk2.tar --file=disk3.tar largefile.tgz

Sommaire:

-c = Create
-M = multi-volume
-L 102400 = 100MB files (disk1.tar, disk2.tar, disk3.tar ...)

(Pour le -L, spécifiez autant de fichiers que nécessaire pour que la somme totale des fichiers tar soit supérieure à largefile.tgz)

Si vous essayez de créer tarune arborescence de répertoires

user1260486
la source
1

Je l'ai fait fonctionner avec les commandes suivantes:

mkdir -p ./split
rm -rf ./split/*
tar -cML 102400 -F 'cp "${TAR_ARCHIVE}" \
    ./split/part_${TAR_VOLUME}.tar' \
    -f split/part_1.tar large_file.tar.gz

Le seul problème est que ce part_1.tarsera en fait le dernier fichier, et les autres sont décalés d'un. C'est à dire en part_2.tarfait la première partie, et part_k.tarest la (n - 1)troisième partie. Corriger cela avec un script shell est trivial et laissé comme exercice pour le lecteur.

strupo
la source
1

il créera automatiquement des fichiers de 1,1 Go, si votre tar est plus grand, vous pouvez augmenter le nombre, par exemple 1000 {2..1000} ou vous pouvez augmenter l'entrée en argument de longueur de bande.

tar --tape-length=1048576 -cMv --file=tar_archive.{tar,tar-{2..100}} backup.tar.lzma
GraphicalDot
la source