スペースを節約するために複数の段階で分割tarアーカイブを作成するにはどうすればよいですか?
tarアーカイブを作成しようとしている非常に大きなフォルダーがあります。問題は、アーカイブ全体を保存するのに十分な空き容量がないため、一度に100〜200 GBのアーカイブのチャンクを作成し、それらを個別にクラウドストレージに転送したいということです。HDDがいっぱいにならないように、新しいチャンクがいつ作成されるかを制御できる必要がありますが、分割tarballを作成するために見つけたすべてのコマンドは、常に同じディレクトリに一度にすべてを作成します。
私が見つけた最も近い解決策はこの質問からでしたが、すべての回答はファイルの数に基づいており、ファイルサイズが不均一に分散しているため、サイズではなく、私のユースケースにとって重要です。
回答
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
と、再び開かれます。
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"