スペースを節約するために複数の段階で分割tarアーカイブを作成するにはどうすればよいですか?

Jan 08 2021

tarアーカイブを作成しようとしている非常に大きなフォルダーがあります。問題は、アーカイブ全体を保存するのに十分な空き容量がないため、一度に100〜200 GBのアーカイブのチャンクを作成し、それらを個別にクラウドストレージに転送したいということです。HDDがいっぱいにならないように、新しいチャンクがいつ作成されるかを制御できる必要がありますが、分割tarballを作成するために見つけたすべてのコマンドは、常に同じディレクトリに一度にすべてを作成します。

私が見つけた最も近い解決策はこの質問からでしたが、すべての回答はファイルの数に基づいており、ファイルサイズが不均一に分散しているため、サイズではなく、私のユースケースにとって重要です。

回答

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

/path/to/transferred.volume用にボリューム#2を準備し、リターンキーを押します。

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

編集:これは、macOS(自作付き)にインストールできるGNUTarでのみ機能します。

brew install gnu-tar

デフォルトのtarとして使用するには、次のようにパスに追加する必要があります。

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