😊
巨大ディレクトリの分割圧縮
巨大ディレクトリの分割圧縮
概要
大量のファイル、大量のディレクトリがあるディレクトリを tar で圧縮を有効にして固めると激しく CPU、メモリを消費してなかなか完了しません。tar
+ split
+ 圧縮コマンド(ここでは zstd
) を使用することで比較的速く圧縮しながら固めることができます。
tar に固めながら split
コマンドで分割することで一回当たりの圧縮対象を小さく抑えながら圧縮することで処理時間を節約できます。
結論
最終形のコマンド例
カレントディレクトリ以下を tar で固めながら 1GB ずつに分割して各ファイルを zstd で圧縮して、../target.tar000.zst
, ../target.tar001.zst
, ../target.tar002.zst
, ... に出力する場合のコマンド例
tar -cf - . | split -a 3 -d -b 1G --filter='zstd > $FILE.zst' - ../target.tar
アーカイブ対象から特定のファイルやファルダを除外する場合は tar -cf - .
の部分で tar --exclude='*.sock' -cf - .
など、 --exclude=
で除外指定します。
分割圧縮したファイルの解凍
圧縮したファイルzstを列挙して zstdcat
で標準出力に一括で出力して tar xvf
で展開する。
tar xvf
の v
は省略可能。
mkdir temp
cd temp
ls ../*.zst | xargs zstdcat | tar xvf -
説明
zstd
大量のデータを高速に圧縮するために faceboook の zstd を使います。
インストール方法 (ubuntu 21.10)
以下でインストールできます。
sudo apt install -y zstd
参考
split
インストール方法 (ubuntu 21.10)
GNU Coreutils の一部なのですでにインストールされているはず。
参考
使い方
-
-b SIZE
オプションを指定するとSIZE
バイト毎にバイナリファイルとして分割します。 -
-d
を指定すると 0 で始まる接尾辞を付けます。 -
--filter=COMMAND
で分割したファイルに対して COMMAND で指定したプログラムを起動することができます。入力ファイルは$FILE
として渡されます。
--filter='zstd > $FILE.zst'
のようにすると分割したファイルを zstd で圧縮して、拡張子 zst のファイルに保存します。
tar で固めながら、split で分割して、各ファイルを zstd で圧縮する
tar -cf - . | split -a 3 -d -b 1G --filter='zstd > $FILE.zst' - ../target.tar
-
tar -cf - .
でカレントディレクトリの内容を tar で固めて標準出力に出力します。 -
split
コマンドで 1GB 単位にバイナリデータとして分割します。 -
--filter='zstd > $FILE.zst'
で分割後のファイルをzstd
で圧縮します。 - prefix として
../target.tar
に出力します。 -
-a 3
を指定しているので接尾辞は 3桁になります。(000
,001
,002
, ...) (省略した場合は 2 桁になります) - 最終的な結果としては
../target.tar000.zst
,../target.tar001.zst
,../target.tar002.zst
, ... となります。
参考
Discussion