Jak utworzyć podzielone archiwum tar w wielu etapach, aby zaoszczędzić miejsce?

Jan 08 2021

Mam bardzo duży folder, w którym próbuję utworzyć archiwum tar. Problem polega na tym, że nie mam wystarczającej ilości dodatkowego wolnego miejsca, aby przechowywać całe archiwum, więc chcę utworzyć, powiedzmy, fragmenty archiwum o pojemności 100-200 GB na raz i przenieść je indywidualnie do magazynu w chmurze. Muszę mieć możliwość kontrolowania, kiedy tworzone są nowe fragmenty, aby mój dysk twardy nie zapełniał się, ale wszystkie polecenia, które znalazłem do tworzenia podzielonych paczek archiwalnych, zawsze tworzą je wszystkie naraz, w tym samym katalogu.

Najbliższym rozwiązaniem, które znalazłem, było to pytanie, ale wszystkie odpowiedzi opierają archiwa na liczbie plików, a nie na rozmiarze, co jest ważne w moim przypadku użycia, ponieważ moje rozmiary plików są nierównomiernie rozłożone.

Odpowiedzi

2 EduardoTrápani Jan 08 2021 at 10:09

Możesz korzystać tarz tych opcji:

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

Na końcu każdego woluminu wywoła twój skrypt, który będzie miał pewne zmienne środowiskowe, aby wiedzieć, który wolumin został właśnie przetworzony. Sprawdź stronę podręcznika, aby zobaczyć pełną listę, ale przynajmniej zmienna TAR_VOLUME jest całkiem przydatna, na wypadek, gdybyś musiał zmienić nazwę pliku wyjściowego lub w jakiś sposób śledzić bieżącą głośność:

TAR_VOLUME Liczba porządkowa przetwarzanego woluminu tar (ustawiana w przypadku odczytu wielotomowego archiwum).

Jeśli powrót skryptu 0 tarbędzie kontynuowany, w przeciwnym razie zostanie zatrzymany.

Na przykład utworzy to każdy wolumin o maksymalnym rozmiarze 20 MB, wywołując skrypt za każdym razem, gdy zostanie osiągnięty limit:

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

Skrypt może być prosty echo "Next volume";readlub nawet można z niego wykonać transfer (zmiana nazwy woluminu, ponieważ po wyjściu /tmp/volume.tarzostanie nadpisana).

Po drugiej stronie użyj flagi --multi-volume. Jeśli tego nie zrobisz, tar zatrzyma się z błędami (zostawiam to na wypadek, gdyby ktoś szukał błędu):

tar: nieoczekiwany EOF w archiwum

tar: Błędu nie można naprawić: zamykam teraz

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

Przygotuj wolumin nr 2 dla /path/to/transferred.volume i naciśnij return:

tarpoprosi o nowy wolumin. Po naciśnięciu enter /path/to/transferred.volumezostanie ponownie otwarty i tak dalej.

1 JoshHarrison Jan 09 2021 at 01:30

Kontynuując doskonałą odpowiedź eduardo-trápaniego , poniżej znajduje się nieco zmodyfikowana wersja skryptu znalezionego na stronie GNU, który czeka na wprowadzenie danych przez użytkownika dla każdego woluminu i ponawia próby, jeśli wolumin nie zostanie znaleziony:

Dla kompletności jest to polecenie używane do tworzenia archiwum:

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

A oto polecenie, którego użyłem do wyodrębnienia podzielonego archiwum:

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

Edycja: Działa tylko z GNU Tar, który można zainstalować na macOS (w / Homebrew) przez:

brew install gnu-tar

Aby użyć go jako domyślnego tar, musisz dodać go do swojej ścieżki w następujący sposób:

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