Crea un archivio tar diviso in blocchi di dimensioni massime


83

Devo eseguire il backup di una directory abbastanza grande, ma sono limitato dalla dimensione dei singoli file. Vorrei essenzialmente creare un tar.(gz|bz2)archivio che è suddiviso in archivi massimi di 200 MB. Clonezilla fa qualcosa di simile a questo dividendo i backup delle immagini così chiamati:

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

C'è un modo per farlo in un solo comando? Capisco come usare il splitcomando, ma mi piacerebbe non dover creare un archivio gigante, quindi dividerlo in archivi più piccoli, poiché ciò raddoppierebbe lo spazio su disco di cui avrei bisogno per creare inizialmente l'archivio.


Risposte:


108

Puoi eseguire il pipe di tar al comando split:

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

Su alcuni sistemi * nix (come OS X) potresti ricevere il seguente errore:

split: illegal option -- -

In tal caso, prova questo (nota il -b 200m):

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

Se si sta tentando di dividere il file per adattarlo a un'unità formattata FAT32, utilizzare un limite di byte di 4294967295. Ad esempio:

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

3
Grande! Come posso quindi estrarre l'archivio?
Naftuli Kay,

24
Farà cat sda1.backup.tar.gz.* | tar xzvf -il lavoro?
Naftuli Kay,

3
Sì, dovrebbe. splitper impostazione predefinita imposta i nomi dei file in modo che, quando ordinati per LOCALE (che è fatto da shell globbing) siano nell'ordine corretto.
Giordania,

4
Senza verbose, basta fare a tar czf ...meno di ve fondersi per cat backup.tar.gz.* | tar tar xzf - senza v. Non vedo alcun beneficio dell'output dettagliato qui v.
Léo Léopold Hertz 준영

1
Ho appena aiutato un amico impacchettando Xcode su un'unità flash formattata FAT32 con: tar cvzf - Xcode.app/ | split -b 2000m - /Volumes/PH/xcode/xcode.tgz(usato da cd /Applications/) Grazie mille :)
ect

13

Su macOS, il splitcomando funziona in modo leggermente diverso:

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

4

Solo per aggiungere: poiché la dimensione massima consentita del file in vfat / fat32 è 2 ^ 32 meno 1 (4294967295 byte), il comando diviso con la dimensione massima consentita del file su tale file system è:

split -b4294967295 -d my_input_file my_output_file_splitted

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

È necessario uno script per l'automazione che sposta il file pseudo-tape.tar su un nuovo nome:

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"

Non ho sottovalutato la tua risposta, perché sono felice di vederne una che lo utilizza -M --tape-length. Tuttavia, questa risposta ignora la richiesta del PO di una soluzione che utilizza la compressione gzip o bzip2.
sampablokuper,

Attenzione: non stai parlando tarma piuttosto di un clone tar chiamato gtar(GNU tar). Questo clone tar supporta la creazione di archivi multi volume ma con una notevole probabilità non è in grado / non è disposto a estrarre da quegli archivi multi volume poiché afferma erroneamente che un volume di follow-up non è la parte di continuazione corretta.
schily,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.