シナリオは次のとおりです。フォルダに1000個のファイルがあり、各ファイルのサイズは約3MBです。すべてのファイルを各zipごとに50MBに圧縮し、元のファイルを削除したいと思います。
メモ:50MBには20個のファイルまたは10個のファイルを含めることができますが、zipは50MB以下でなければなりません。
データを失うことなくこのファイルを転送したいと思います。ファイルは(tar / gzip / bzip)形式でなければなりません。データ損失を克服する他の方法がある場合は、私に提案してください。
シェルスクリプトを作成する必要があります。
答え1
1つの解決策は、分割コマンドを使用することです。
分割コマンドは、アーカイブを複数のファイルに分割し、すべての難しい作業を実行します。
例は次のとおりです。
tar -cvf - file1 file2 file3 | split --bytes=50m --suffix-length=4 --numeric-suffix - myarchive.tar.
そして解凍した:
cat myarchive.tar.* | tar xvf -
答え2
このzip
ファミリは以下をサポートします。圧縮パッケージ2圧縮と--split
。
bzip2はあなたの要件を満たしていますか?
-s 分割サイズ --split-size 分割サイズ 分割アーカイブ生成を有効にし、分割サイズを設定します。分割アーカイブは、複数のファイルに分割できるアーカイブです。アーカイブの作成時にアーカイブのサイズが指定されたパーティションサイズに達すると、パーティションが閉じて次のパーティションが開きます。
...
分割サイズは数値です(オプションで乗数は後に続くことがあります)。現在の数字は整数でなければなりません。乗数は現在、k(キロバイト)、m(メガバイト)、g(ギガバイト)、またはt(テラバイト)のいずれかです。 64kが最小分割サイズなので、乗数のない数値はデフォルトでメガバイトです。たとえば、分割サイズが670 MBでCDを焼くのに役立つbarディレクトリの内容を含むfooという分割アーカイブを作成するには、次のコマンドを実行します。
zip -s 670m -r foo バー
として使用できます。
データの整合性を確保するためにrsync
チェックサムチェックがあります。はるかに遅いですが、転送の両側でチェックサムを計算します。
-c、--チェック島
これは、rsyncがファイルが変更されたかどうかを確認する方法を変更します。このオプションがない場合、rsyncはlqquick checkrq(デフォルト)を使用して、送信者と受信者の間の各ファイルサイズと最後の変更時刻が一致することを確認します。このオプションは、各ファイルの128ビットチェックサムを一致するサイズと比較するようにこの設定を変更します。チェックサムを作成することは、両当事者が転送中のファイルのすべてのデータを読み取るために多くのディスクI / Oを消費することを意味します(変更されたファイルを転送するときに読み取りが実行される前に)、作業が大幅に遅くなる可能性があります。
答え3
未テスト
cd /the/directory
files=(*)
i=0
z=0
create_zip=true
for ((i=0; i<${#files[@]}; i++)); do
if $create_zip; then
((z++))
zip_file=prefix.$z.zip
create_zip=false
fi
# add the file
zip $zip_file "${files[i]}"
# check the size
if (( $(stat -c %s $zip_file) >= 50000000 )); then
# remove the previous file
zip -d $zip_file "${files[i]}"
create_zip=true
# decrement the file index so this file gets added to the next zip
((i--))
else
echo rm "${files[i]}" ### remove "echo" if it's OK
fi
done