Windows
Linux
コマンド
圧縮解凍
並列処理

圧縮展開系のコマンドのまとめ

圧縮してやる!!一匹残らず!!

MacBook AirのSSDが突然お亡くなりになったとか流れてきて怖いなぁって思って、しこしことDropboxに移動しています。
Premium万歳。
とりあえずほぼお目見えすることのないファイルは圧縮して容量節減しようと思いたって、このエントリを書きました。
tarでまとめたほうが大量のファイルをちまちま転送するよりも効率的ですしね。

オプションとかの物忘れ激しいので自分用のユーティリティとしてまとめておきます。

圧縮・解凍の体系

大層なものでもないですが、基本的に以下の体系を持っています。
少なくとも私の使い道ではですが・・・。

  • Linux系
    基本的にtarの合わせ技で使うことが多い。
    • gzip: 一般的な圧縮率。
    • bzip2: より強力な圧縮。時間がかかる。バックアップとしてはこれが一般的とのこと。
    • xz: LZMA2 アルゴリズムを使用する。7z の親戚。 Linux のカーネルソースとか巨大なソース等の圧縮に採用されている。最近のディストリならたいてい標準で入っている。圧縮率は bzip2 よりも優位だがより CPU、メモリリソースを消費する。
      正直時間がかかる割に bzip2 よりサイズがでかくなるパターンがたまにあるので注意。
      最近流行にのって単発の圧縮ならこれをよく使ってる。
    • zip: あんまり使わないなあ。。。
  • Windows系
    • zip: 普通はこれで圧縮解凍する。
    • 7z
      • 何より圧縮率が高くて重宝する。
      • 機密情報を扱ったりするときはAES暗号をかまして、自己解凍書庫形式にして送る。
    • lzh: 過去の遺物。ネット黎明期に異常に流行った。

2GB超のファイルとかは7z形式で取り扱います。
仮想マシンとかバックアップしようとして以前ハマったのですが、2GB超のファイルをzipで圧縮しようとすると書庫がかなり高い確率でぶっ壊れます。

Windowsだと巨大なファイルを扱う形式としてわりと自分の中で一般的なのですが、Linuxだとtarでいったんファイルを全部まとめてからgzipで圧縮かけるので、書庫は壊れなかった気がするのですが、どうなんでしょう。
少なくともtarでファイルの一覧を固めるだけでは壊れることはないようです。

さてさて、本題のTipsに参りたいと思います。

フォルダとかまるごと

c をつける。

圧縮 tar.gz

tar cvzf hogehoge.tar.gz hogehoge/

めっちゃ圧縮 tar.bz2

以前は y がbzip2圧縮のトリガーになっていましたが、今は j になっています。

tar cvjf hogehoge.tar.bz2 hogehoge/

超めっちゃ圧縮 tar.xz

tar cvJf hogehoge.tar.xz hogehoge/

解凍

x をつける。

gzip

tar xvzf hogehoge.tar.gz

bzip2

tar xvjf hogehoge.tar.bz2

xz

tar xvJf hogehoge.tar.xz

7z

sudo apt -y install p7zip-full
mkdir bigdata/
mv bigdata.7z bigdata/
cd bigdata/
7za e bigdata.7z

単一ファイル

圧縮

それなりの圧縮gzip

  • 元ファイルを残さない版
gzip result.txt
  • 元ファイルを残したい版

-c オプションを付ける。

gzip -c result.txt >result.txt.gz

もっと圧縮bzip2

gzipより少し時間がかかる。

  • 元ファイルを残さない版
bzip2 マイノート-201309141059.enex
  • 元ファイルを残したい版

-c オプションを付ける。

bzip2 -c マイノート-201309141059.enex

展開

gzip

  • 元ファイルを残さない版
gzip -d result.txt.gz
  • 元ファイルを残す版
gzip -dc result.txt.gz >result.txt

bzip2

-d (decompress)です。

  • 元ファイルを残さない版
bzip2 -d result.txt.bz2
  • 元ファイルを残す版
bzip2 -dc result.txt.bz2 >result.txt

以上です。

適宜メモりたいものが出たらここに追加していきます。

並列圧縮というソリューション

通常の圧縮コマンドだと CPU 1 コアしか使われません。もったいないですね。
私も日常のオペレーションでコア数の多いサーバ上で圧縮をするときこんなに CPU スレッドが余ってるのにもったいないなあと思っていました。

すると pxz, pigz, pbzip2 等のマルチスレッド対応版の p* 系圧縮解凍コマンドが存在しています。
大抵のディストリビューションでは RHEL 系では EPEL 入れれば yum で入りますし、 Debian 系は apt-get で入ります。
オプションは上記で紹介したものと同じです。

  • pigz: gzip コマンドのマルチスレッド対応版
  • pbzip2: bzip2 コマンドのマルチスレッド対応版
  • pxz: xz コマンドのマルチスレッド対応版

これらの p* 系圧縮解凍コマンドを使うと全コア全スレッド使って並列に全力で圧縮処理がされるので何倍も速いです。

tar での併用

通常だとシングルスレッド版の圧縮プログラムが使用されるので --use-compress-prog=pxz の用な感じでオプションを渡してあげる必要があります。
逆に tar cvzf, cvjf, cvJf 等圧縮の指定オプションを渡すとエラーになるので注意です。

tar cvf archive.tar.xz --use-compress-prog=pxz awesome-logs/

Tips

圧縮解凍テスト用のファイルの準備の仕方。

適当な内容のファイルを準備する私なりのやり方。
そのまま待ってるとディスクを全部使いきるまで終わらないので Ctrl+C で終了させてくださいw

  • ひたすらyを書き込む
yes > result.txt
  • ランダムなバイナリを書き込む

ほんとにランダムなバイナリなので圧縮とか意味ないかも。

cat /dev/urandom > result2.txt

参考サイト

  1. Linuxコマンド集 - 【 bzip2 】 ファイルを圧縮・展開する(拡張子.bz2):ITpro
  2. xz 形式で圧縮展開する(tar 使う版) - 戦場のプログラマー