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
。