Come creare un archivio tar diviso in più fasi per risparmiare spazio?
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
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
tar
continuerà, 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";read
oppure potresti anche fare il trasferimento da esso (rinominando il volume, perché una volta uscito /tmp/volume.tar
verrà 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:
tar
richiederà il nuovo volume. Una volta premuto invio /path/to/transferred.volume
verrà riaperto e così via.
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"