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


## 圧縮してやる！！一匹残らず！！

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

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

## 圧縮・解凍の体系

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

- Linux系  
基本的にtarの合わせ技で使うことが多い。
  - gzip: 一般的な圧縮率をもった標準的な圧縮方式。
  - bzip2: より強力な圧縮方式。時間がかかる。バックアップとしてはこれが一般的とのこと。Bacula とかでは標準だと GZIP 圧縮が使用されているようだが
  - xz: LZMA2 アルゴリズムを使用する。7z の親戚。 Linux のカーネルソースとか巨大なソース等の圧縮に採用されている。最近のディストリならたいてい標準で入っている。圧縮率は bzip2 よりも優位だがより CPU、メモリリソースを消費する。  
**正直時間がかかる割に bzip2 よりサイズがでかくなるパターンがたまにあるので注意。**  
最近流行にのって単発の圧縮ならこれをよく使ってる。
  - zip: あんまり使わないなあ。。。
- Windows系
  - zip: 
    - 普通はこれで圧縮解凍する。
    - 取引先に送るときは伝送経路にメールを使用するときはパスワードを設定して送付することが多い。
      - パスワードはメール以外の伝達経路で伝えておくのがよい
        - 打ち合わせ時に決める
        - 電話で決める
        - 双方しか知りえない情報をパスワードにする等
        - パスワード別送メールは ISO/IEC 27001:2013(ISMS) に適合したりするためにやる苦し紛れの方法で、現代においては批判されることが多い）
  - 7z
     - 何より圧縮率が高くて重宝する。
     - 機密情報を扱ったりするときはAES暗号をかまして~~、自己解凍書庫形式にして~~送る。（ exe を ex にするとかやめようね）
     - 暗号強度が高くても取引先に送るときはほぼ使っているのを見たことがない。「開けないんだけど？」と言われるのがオチ。
  - lzh: 過去の遺物。ネット黎明期に異常に流行った。

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

- [お池にハマってさあ大変 - ZIPの2GB制限](http://www.nozuchi.net/oike/?p=5)

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

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

## フォルダとかまるごと

`c` をつける。

### 圧縮 tar.gz

```bash
tar cvzf hogehoge.tar.gz hogehoge/
```

### めっちゃ圧縮 tar.bz2

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

```bash
tar cvjf hogehoge.tar.bz2 hogehoge/
```

### 超めっちゃ圧縮 tar.xz

```bash
tar cvJf hogehoge.tar.xz hogehoge/
```

### 解凍

`x` をつける。

#### gzip

```bash
tar xvzf hogehoge.tar.gz
```

#### bzip2

```bash
tar xvjf hogehoge.tar.bz2
```

#### xz

```bash
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

* 元ファイルを残さない版

```bash
gzip result.txt
```

* 元ファイルを残したい版

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

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

#### もっと圧縮bzip2

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

* 元ファイルを残さない版

```bash
bzip2 マイノート-201309141059.enex
```

* 元ファイルを残したい版

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

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

### 展開

### gzip

* 元ファイルを残さない版

```bash
gzip -d result.txt.gz
```

* 元ファイルを残す版

```bash
gzip -dc result.txt.gz >result.txt
```

### bzip2

`-d` (decompress)です。

* 元ファイルを残さない版

```bash
bzip2 -d result.txt.bz2
```

* 元ファイルを残す版

```bash
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` コマンドのマルチスレッド対応版
    - Ubuntu 20.04 に pxz は含まれなくなりました。そのかわり、 `xz -T0` がネイティブで使えるようになっています。

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

### tar での併用

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

```
tar cvf archive.tar.bz2 --use-compress-prog=pbzip2 awesome-logs/
```

xz コマンドの場合

```
tar cvf archive.tar.xz --use-compress-prog="xz -T 0" awesome-logs/
```

## Tips

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

* ひたすらyを書き込む

```bash
yes > result.txt
```

* ランダムなバイナリを書き込む

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

```bash
cat /dev/urandom > result2.txt
```

## 参考サイト

1. [Linuxコマンド集 - 【 bzip2 】 ファイルを圧縮・展開する(拡張子.bz2)：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230722/)
1. [xz 形式で圧縮展開する（tar 使う版） - 戦場のプログラマー](http://blog.pg1x.com/entry/2015/10/31/212643)