スペースが不足したときに複数のファイルに分割された圧縮アーカイブを作成する方法

スペースが不足したときに複数のファイルに分割された圧縮アーカイブを作成する方法

9GBドライブに7GBをバックアップしたいです。つまり、空き容量が約2GBしかありません。

ただし、tar関連するソリューションでは、まずすべてをファイルに入れてから分割する必要があります。

チャンクごとにリモートドライブに転送できるようにアーカイブ(圧縮することもできますが、必ずしも圧縮する必要はありません)と分割は可能ですか?

私の言葉は

  • 最初のファイルが準備されたら、外部ドライブに移動してシステムから削除したいと思います。

  • 2番目のファイルが準備されたら移動します。

答え1

ソースから複数のアーカイブに分割します。

duを使用して最大のディレクトリの一部を検索し、最初にアーカイブ/圧縮します(tar | gzipまたは直接tar圧縮オプションを使用)。 .tgzファイルをリモートドライブにコピーしてサイズを確認したら、マスターディスクから削除してください。

約5 GBのファイルがアーカイブされるまで、他の大きなディレクトリに対してこの操作を繰り返します。

最後に、デフォルトのディレクトリをアーカイブして圧縮しますが、tarの除外オプションを使用してアーカイブされたディレクトリの名前を指定します。

あるいは、tarとgzipをパイプし、sshにパイプしてリモートドライブに書き込むこともできます。次のようなもの(オプションを確認):

tar cfz - myBaseDir | ssh myRemote 'cat > myArchive.tg z'

答え2

私が知る限り、そのような言葉はありません。しかし、私はすべてのファイルを複数のタールボールに入れる小さなbashスクリプトを書いた。

#!/bin/bash

package_i=1
all_files=$(find . -name "*" -type f)

# stop on every 100 MB for now
max_size=104857600

for f in $all_files; do
        #
        # add file to current tar file
        #
        tar -rvf package${package_i}.tar $f

        #
        # check if the size is more than 100 MB
        # if so, then wait till current package tar
        # was moved by user to another storage
        # and then proceed
        #
        size_of_current_package=$(stat --printf="%s" package${package_i}.tar)
        if [ $size_of_current_package -ge $max_size ]; then
                read -p "Will wait when you moved package${package_i}.tar to another storage ..."
                package_i=$(( $package_i + 1 ))
                echo "=== Package iterator is now '${package_i}' ==="
        fi
done

このスクリプトは、現在のpackageX.tarファイルにファイルを1つずつ(package1.tarなどpackage2.tar)追加します。ファイルが特定のバイト数(この場合は100MBまたは104857600バイト)を超える場合、packageX.tarユーザーがファイルを別のリポジトリーにコピーするのを待ってから、ユーザーpackageX.tarがをクリックすると続行されますEnter

関連情報