Как создать разделенный tar-архив в несколько этапов для экономии места?
У меня очень большая папка, из которой я пытаюсь создать tar-архив. Проблема в том, что у меня недостаточно свободного места для хранения всего архива, поэтому я хочу создавать, скажем, 100-200 ГБ фрагментов архива за раз и переносить их по отдельности в облачное хранилище. Мне нужно иметь возможность контролировать, когда создаются новые куски, чтобы мой жесткий диск не заполнялся, но все команды, которые я нашел для создания разделенных архивов, всегда создают все сразу в одном каталоге.
Ближайшее решение, которое я нашел, было связано с этим вопросом, но все ответы основывают архивы на количестве файлов, а не на размере, который важен для моего варианта использования, поскольку размеры моих файлов распределены неравномерно.
Ответы
Вы можете использовать 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
, снова откроется, и так далее.
Следуя отличному ответу 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"