圧縮してやる!!一匹残らず!!
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: 過去の遺物。ネット黎明期に異常に流行った。
- zip:
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
コマンドのマルチスレッド対応版- Ubuntu 20.04 に pxz は含まれなくなりました。そのかわり、
xz -T0
がネイティブで使えるようになっています。
- Ubuntu 20.04 に pxz は含まれなくなりました。そのかわり、
これらの 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
で終了させてくださいw
- ひたすらyを書き込む
yes > result.txt
- ランダムなバイナリを書き込む
ほんとにランダムなバイナリなので圧縮とか意味ないかも。
cat /dev/urandom > result2.txt