ファイルの圧縮

14.5.3. ファイルの圧縮

圧縮と復元 (伸張) の方法として、二つの流儀が使われています。細かい指示の方法や性能が少し違いますが、機能はおおむねどちらも同じです。ECCS iMac端末ではどちらも使えます。

以下は、圧縮と対応する復元方法を順に紹介しますが、手っ取り早く復元するだけなら最後に紹介する unar がお勧めです。

以下の流儀1と2の番号は、このページの説明でつけたもので、一般的な意味はありません。

流儀1 流儀2
圧縮と復元 gzip, bzip2, xz zip
アーカイブ tar zip

ターミナルで 13. コマンドの基本 の内容を使います。

サンプルファイル #

次の 3 つのファイルを自分のディレクトリにダウンロードしてください。それぞれのファイル名を、マウスの右ボタンでクリックして、出てきたメニューから、リンク先のファイルを別名でダウンロードを選びます (ダウンロード先は自分で適当に決めましょう)。

  • text-1.txt 日本国憲法前文 (英語版) 先頭1000バイト
    冒頭は We, the Japanese people
  • text-2.txt text-1 を文字毎にASCII順に並び替えたもの
    (冒頭は改行と空白文字です)
  • text-3.txt ASCII印字可能文字 (改行やタブなど一部の制御文字を含む) をランダムに1000バイト
    冒頭は {Cyy%V1Q

ls コマンドによって、どのファイルも大きさが 1000 バイトであることが分かります。

ls -l
-rw-------  1 1230045600  student  1000 Mar 26 14:30 text-1.txt
-rw-------  1 1230045600  student  1000 Mar 26 14:30 text-2.txt
-rw-------  1 1230045600  student  1000 Mar 26 14:30 text-3.txt

ファイルをテキストエディタなどアプリケーションで開くと、 付加情報が設定され、それも一緒に圧縮されて圧縮後のファイルが大きくなることがあります。 このことは上記の ls の結果が -rw-------@ など末尾に @ がつくことから判別できます xattr -c text-3.txt などで消せますが、いったん消してからダウンロードし直しても良いです。

16.6.4. パーミッションと実行ファイル

これらを圧縮してみます。

ファイル1つの圧縮と復元 #

はじめに、ファイル1つの圧縮と復元を試しましょう。 流儀によって使い方に多少差があるので、gzipzip を例に説明します。

流儀 圧縮 復元 復元 拡張子
1 gzip gunzip gzip -d .gz
1 bzip2 bunzip2 bzip2 -d .bz2
1 xz unxz xz -d .xz
2 zip unzip .zip

gzip で圧縮 #

使い方は簡単でコマンド gzip に続けて、 対象ファイルパスをパラメータで渡します。

gzip filename

すると元のファイルが消え、拡張子 .gz を付与した新しいファイル、filename.gz が生成されます。
次のように、3 つのファイルを圧縮してから、サイズを比較してみましょう。

gzip text-1.txt
gzip text-2.txt
gzip text-3.txt

これらのコマンドも、成功すると無言です。エラーが出たときのみ、メッセージが表示されます。
ls -l
-rw-------  1 1230045600  student      511 Mar 26 14:35 text-1.txt.gz
-rw-------  1 1230045600  student      104 Mar 26 14:35 text-2.txt.gz
-rw-------  1 1230045600  student      878 Mar 26 14:35 text-3.txt.gz

元のファイルはいずれも同じ 1000 バイトであったのに、圧縮率に差が生じました。 文字の並びがランダムに近いほど短い符号化が難しいことと、整合しています。

復元するには伸張用のコマンド gunzip によって、圧縮されたファイル filename.gz を元のファイル filename に戻します。

gunzip text-1.txt.gz
gunzip text-2.txt.gz
gunzip text-3.txt.gz

ls -l
-rw-------  1 1230045600  student  1000 Mar 26 14:35 text-1.txt
-rw-------  1 1230045600  student  1000 Mar 26 14:35 text-2.txt
-rw-------  1 1230045600  student  1000 Mar 26 14:35 text-3.txt

様々なオプションがあり、圧縮率と計算時間のトレードオフを調整したり (-9 が圧縮率最高です)、 元ファイルを消さずに新規にファイルを作ったりもできます。 bzip2xz も使い方は同じです。圧縮率が高い代わりに計算時間も長くなります。

zip で圧縮 #

zip はパラメータを二つ取り、前者が作成する .zip のファイル名、後者が対象ファイルのパスです。

zip filename.zip filename

指定した名前の新しいファイル、filename.zip が生成されます。元のファイルは消えません。
次のように、3 つのファイルを圧縮して、サイズを比較してみましょう。

zip text-1.txt.zip text-1.txt
zip text-2.txt.zip text-2.txt
zip text-3.txt.zip text-3.txt

ls -l
-rw-------  1 1230045600  student      663 Mar 26 14:40 text-1.txt.zip
-rw-------  1 1230045600  student      256 Mar 26 14:40 text-2.txt.zip
-rw-------  1 1230045600  student     1130 Mar 26 14:40 text-3.txt.zip

この場合でも、ファイル毎に圧縮率に差が生じました。悪いことに text-3.txt は増えてしまっています。

復元は unzip を使います。 元のファイルがなくても復元できることを試すために、もとの text-1.txt などは事前にゴミ箱などに移動してください。

unzip text-1.txt.zip
unzip text-2.txt.zip
unzip text-3.txt.zip

元のファイルが存在するときに復元しようとすると、上書きしてよいかどうか replace text-1.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: のように質問されます。答えは ynANr のいずれかを答えます。

元ファイルが復元されたことを ls やエディタで確認してください。

ls -l

複数のファイルやフォルダの圧縮 #

フォルダをまとめて圧縮する場合、フォルダ内の「隠しファイル」や「隠しフォルダ」なども同梱されます。他者に渡すときなどは注意しましょう。

tar でまとめて圧縮 #

tar コマンドを使うと、複数のファイルやフォルダを 1 つにまとめて、さらに gzip で圧縮をすることができます。圧縮の際には czf というオプションを指定して使います。c がまとめるという操作を指定し、z が gzip による圧縮であることを表します。そして f の後に、対象となるファイルを指定します。

以下のようにして、file.tar.gz というファイルに 3 つのファイルをまとめて圧縮しましょう。

tar czf text-all.tar.gz text-1.txt text-2.txt text-3.txt
ls -l
-rw------- 1 1230045600 student 1657 Mar 26 15:00 text-all.tar.gz
元のファイルもそのまま残っています
ファイル名やファイルのつなぎ目を表す情報などが含まれるために、ファイルサイズが、それぞれのファイルを圧縮して足し合わせたもの (511+104+878=1493) よりは、大きくなります。

元のファイルを取り出すには、オプションで、c の代わりに x を指定します。
元のファイルがなくても復元できることを試すために、もとの text-1.txt などは事前にゴミ箱などに移動してください。

tar xzf text-all.tar.gz

復元されたことを確認してください。

オプションの zjJ に変更すると、圧縮に bzip2 や xz が使われます。

zip でまとめて圧縮 #

zip コマンドも、パラメータとしてファイルを複数与えることができます。

zip text-all.zip text-1.txt text-2.txt text-3.txt

ここでは使いませんが、フォルダをまとめるときは -r オプションを使います。

zip -r folder.zip foldername

復元方法は unzip で、ファイル1つの時と同じです。

Zipでの圧縮は、GUI でも可能です 11.9. アーカイブ

復元前の確認 #

tarunzip でファイルを取り出す前に、どのファイルが取り出されるのか確認すると安全です。
そのために tar tzfunzip -l というコマンドが用意されています。

tar tzf text-all.tar.gz
text-1.txt
text-2.txt
text-3.txt
unzip -l text-all.zip
Archive:  text-all.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     1000  03-26-2023 15:00   text-1.txt
     1000  03-26-2023 15:00   text-2.txt
     1000  03-26-2023 15:00   text-3.txt
---------                     -------
     3000                     3 files

unar #

unar を使うと、さまざまなアーカイブ形式や圧縮形式を気にせず解凍できます。実用的にはこちらが便利でお勧めします。

unar text-all.tar.gz
unar text-all.zip

アーカイブの内容は lsar で確認します。

lsar text-all.tar.gz
text-all.tar.gz: Tar in Gzip
text-1.txt
text-2.txt
text-3.txt
lsar text-all.zip
text-all.zip: Zip
text-1.txt
text-2.txt
text-3.txt

unar は homebrew などでインストール可能です。
可変長符号化 ファイルの圧縮 暗号化と電子署名