😊

巨大ディレクトリの分割圧縮

2022/04/14に公開約2,300字

巨大ディレクトリの分割圧縮

概要

大量のファイル、大量のディレクトリがあるディレクトリを 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 xvfv は省略可能。

mkdir temp
cd temp
ls ../*.zst | xargs zstdcat | tar xvf -

説明

zstd

大量のデータを高速に圧縮するために faceboook の zstd を使います。

インストール方法 (ubuntu 21.10)

以下でインストールできます。

sudo apt install -y zstd

参考

https://github.com/facebook/zstd

https://facebook.github.io/zstd/

https://www.manpagez.com/man/1/zstd/

split

インストール方法 (ubuntu 21.10)

GNU Coreutils の一部なのですでにインストールされているはず。

参考

https://linuxjm.osdn.jp/html/GNU_coreutils/man1/split.1.html

使い方

https://linuxjm.osdn.jp/html/GNU_coreutils/man1/split.1.html
  • -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, ... となります。

参考

https://blog.putise.com/linuxで圧縮しながら分割するコマンド/

https://linuxjm.osdn.jp/info/GNU_coreutils/coreutils-ja_31.html

https://uxmilk.jp/8584

https://atmarkit.itmedia.co.jp/ait/articles/1711/24/news016.html

Discussion

ログインするとコメントできます