私のディレクトリには、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-
このコマンドは、tar
stdoutのアーカイブを生成し、出力をsplit
1900MBごとに分割するコマンドにパイプし、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
~のため新しいボリュームスクリプト次のいずれかを使用できます(tar
gnu.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