Jak utworzyć podzielone archiwum tar w wielu etapach, aby zaoszczędzić miejsce?
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
Możesz korzystać tar
z 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
tar
bę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";read
lub nawet można z niego wykonać transfer (zmiana nazwy woluminu, ponieważ po wyjściu /tmp/volume.tar
zostanie 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:
tar
poprosi o nowy wolumin. Po naciśnięciu enter /path/to/transferred.volume
zostanie ponownie otwarty i tak dalej.
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"