6GB TARファイルを別々の1.9GB TARファイルに分割

6GB TARファイルを別々の1.9GB TARファイルに分割

私のディレクトリには、6.7 GBのサイズのファイルが28,000個ありますaaa/input

aaa/output各TARファイルが1.9 GBを超えないようにディレクトリにTARファイルを作成する必要があるため、以下のように28,000個のファイルを4つのTARファイル(6.7/1.9)に圧縮する必要があります。

Log_(current date)_01.tar
Log_(current date)_02.tar
...
etc.

各タールボールを1.9GB未満に保ちます。

Unixスクリプトを使用してこれを行う方法はありますか?

答え1

tar以下を組み合わせてsplitこれを達成できます。

tar cf - aaa/input | split --bytes=1900m --filter='gzip > $FILE.gz' --numeric-suffixes - ./Log-

このコマンドは、tarstdoutのアーカイブを生成し、出力をsplit1900MBごとに分割するコマンドにパイプし、gzipを介してデータをフィルタリングし、stdinを入力(the -)として使用し、出力をプレフィックスとともに現在のディレクトリに配置します。Log-

出力は次のとおりです。

./Log-00.gz
./Log-01.gz
..

split入力は1900Mに分割され、圧縮後は小さくなるため、ファイルサイズは小さくなります。

またはあなたは使用することができます

printf 'n Log-%02d.tar\n' {2..4}|tar cf Log-01.tar -ML1900m aaa/input

アーカイブを作成します。

nコマンドの最初のコマンドは、次のアーカイブの新しい名前をprintf表します。tarこれが範囲が2から始まる理由です。

通常、tar が新しいアーカイブを求めるメッセージを表示すると、次のようになります。

Prepare volume #2 for '<my tar file>' and hit return:

押すと、?次のショートカットメニューが表示されます。

 n name        Give a new file name for the next (and subsequent) volume(s)
 q             Abort tar
 y or newline  Continue operation
 !             Spawn a subshell
 ?             Print this list

答え2

GNU tarを実行できる場合は、オプション--tape-length=Nと 。--new-volume-script

ボリュームを作成するコマンドは次のとおりです。

tar cvf volume /path/to/files --tape-length=1945M --new-volume-script=/path/to/script.sh

そしてそれからすべてを抽出します。

tar xvf volume --new-volume-script=/path/to/script.sh

~のため新しいボリュームスクリプト次のいずれかを使用できます(targnu.org ドキュメント)。ボリュームの作成、一覧表示、比較、抽出と連携します。あるいは、それを変更してボリューム名を変更したり、最初から独自のボリューム名を作成したりできます。使用可能な環境値については、マニュアルページを確認してください。

#! /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 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 || exit 1
          ;;
*)        exit 1
esac

echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

関連情報