Come creare un archivio tar diviso in più fasi per risparmiare spazio?

Jan 08 2021

Ho una cartella molto grande di cui sto cercando di creare un archivio tar. Il problema è che non ho abbastanza spazio libero extra per archiviare l'intero archivio, quindi voglio creare blocchi di archivio da 100-200 GB alla volta e trasferirli individualmente nell'archivio cloud. Devo essere in grado di controllare quando vengono creati nuovi blocchi in modo che il mio HDD non si riempia ma tutti i comandi che ho trovato per creare tarball divisi li creano sempre tutti in una volta, nella stessa directory.

La soluzione più vicina che ho trovato proveniva da questa domanda, ma tutte le risposte basano gli archivi sul numero di file, non sulla dimensione che è importante per il mio caso d'uso poiché le dimensioni dei miei file sono distribuite in modo non uniforme.

Risposte

2 EduardoTrápani Jan 08 2021 at 10:09

Puoi usare tar, con queste opzioni:

--new-volume-script=COMMAND
--tape-length=N

Alla fine di ogni volume chiamerà il tuo script, che avrà alcune variabili d'ambiente per sapere quale volume è stato appena elaborato. Controlla la pagina di manuale per l'elenco completo, ma almeno la variabile TAR_VOLUME è piuttosto utile, nel caso in cui devi rinominare il file di output, o tenere in qualche modo traccia del volume corrente:

TAR_VOLUME Numero ordinale del volume che tar sta elaborando (impostato se si legge un archivio multi-volume).

Se lo script return 0 tarcontinuerà, altrimenti si fermerà.

Ad esempio, questo creerà ogni volume, con una dimensione massima di 20 M, chiamando il tuo script ogni volta che viene raggiunto il limite:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=/path/to/myscript.sh --tape-length=20M

Lo script può essere un semplice echo "Next volume";readoppure potresti anche fare il trasferimento da esso (rinominando il volume, perché una volta uscito /tmp/volume.tarverrà sovrascritto).

Dall'altro lato, assicurati di usare il flag --multi-volume. Se non lo fai, tar si fermerà con gli errori (lo lascio nel caso in cui qualcuno cerchi l'errore):

tar: EOF imprevisto nell'archivio

tar: Errore non recuperabile: esci adesso

tar xvf /path/to/transferred.volume --multi-volume

Prepara il volume # 2 per /path/to/transferred.volume e premi Invio:

tarrichiederà il nuovo volume. Una volta premuto invio /path/to/transferred.volumeverrà riaperto e così via.

1 JoshHarrison Jan 09 2021 at 01:30

Seguendo l' eccellente risposta di eduardo-trápani , di seguito è riportata una versione leggermente modificata di uno script trovato nella pagina GNU che attende l'input dell'utente per ogni volume e riprova se un volume non viene trovato:

Per completezza questo è il comando utilizzato per creare l'archivio:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=./myscript.sh --tape-length=1000M

E questo è il comando che ho usato per estrarre l'archivio diviso:

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

Modifica: funziona solo con GNU Tar che può essere installato su macOS (con Homebrew) da:

brew install gnu-tar

Per usarlo come tar di default dovrai aggiungerlo al tuo percorso in questo modo:

export PATH="$(brew --prefix)/opt/python/libexec/bin:$PATH"