Как создать разделенный tar-архив в несколько этапов для экономии места?

Jan 08 2021

У меня очень большая папка, из которой я пытаюсь создать tar-архив. Проблема в том, что у меня недостаточно свободного места для хранения всего архива, поэтому я хочу создавать, скажем, 100-200 ГБ фрагментов архива за раз и переносить их по отдельности в облачное хранилище. Мне нужно иметь возможность контролировать, когда создаются новые куски, чтобы мой жесткий диск не заполнялся, но все команды, которые я нашел для создания разделенных архивов, всегда создают все сразу в одном каталоге.

Ближайшее решение, которое я нашел, было связано с этим вопросом, но все ответы основывают архивы на количестве файлов, а не на размере, который важен для моего варианта использования, поскольку размеры моих файлов распределены неравномерно.

Ответы

2 EduardoTrápani Jan 08 2021 at 10:09

Вы можете использовать tarследующие параметры:

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

В конце каждого тома он будет вызывать ваш скрипт, в котором будут некоторые переменные среды, чтобы узнать, какой том только что был обработан. Посмотрите полный список на странице руководства , но, по крайней мере, переменная TAR_VOLUME очень полезна, если вам нужно переименовать выходной файл или каким-то образом отслеживать текущий том:

TAR_VOLUME Порядковый номер обрабатываемого тома tar (устанавливается при чтении многотомного архива).

Если возврат скрипта 0 tarпродолжится, иначе он остановится.

Например, это создаст каждый том с максимальным размером 20M, вызывая ваш скрипт каждый раз, когда будет достигнут предел:

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

Скрипт может быть простым, echo "Next volume";readили вы даже можете сделать перенос из него (переименование тома, потому что после выхода /tmp/volume.tarбудет перезаписан).

С другой стороны, обязательно используйте флаг --multi-volume. Если вы этого не сделаете, tar остановится с ошибками (оставляю на случай, если кто-то найдет ошибку):

tar: неожиданный EOF в архиве

tar: Ошибка не исправима: выход сейчас

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

Подготовьте том # 2 для /path/to/transferred.volume и нажмите return:

tarпредложит вам новый том. Как только вы нажмете Enter /path/to/transferred.volume, снова откроется, и так далее.

1 JoshHarrison Jan 09 2021 at 01:30

Следуя отличному ответу eduardo-trápani , ниже приведена слегка измененная версия сценария, найденного на странице GNU, который ожидает ввода пользователя для каждого тома и повторяет попытку, если том не найден:

Для полноты это команда, используемая для создания архива:

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

И это команда, которую я использовал для извлечения разделенного архива:

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

Изменить: это работает только с GNU Tar, который можно установить на macOS (с Homebrew):

brew install gnu-tar

Чтобы использовать его в качестве tar по умолчанию, вам нужно добавить его в свой путь следующим образом:

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