ファイル圧縮ユーティリティは数多くありますが、すべてのLinuxディストリビューションで見つかるのはgzip
です。1つの圧縮ツールだけを学ぶなら、それはgzip
であるべきです。
アルゴリズムとツリー
gzip
データ圧縮ツールは1990年代初頭に開発され、現在もすべてのLinuxディストリビューションで見つかります。他の圧縮ツールもありますが、どのLinuxコンピューターで作業する必要があっても、gzip
が見つかるでしょう。そのため、gzip
の使い方を知っていれば、何もインストールしなくても問題ありません。
gzip
は、PKZIPで有名なフィル・カッツによって発明され、特許を取得したDEFLATEアルゴリズムの実装です。DEFLATEアルゴリズムは、すべてバリエーションをテーマに動作する以前の圧縮アルゴリズムを改良したものです。圧縮するデータがスキャンされ、一意の文字列が識別されてバイナリツリーに追加されます。
一意の文字列には、ツリー内の位置によって一意のIDトークンが割り当てられます。トークンはデータ内の文字列を置き換えるために使用され、トークンは置き換えられたデータよりも小さいため、ファイルは圧縮されます。元の文字列をトークンに置き換えると、データは圧縮解除されて元の状態に戻ります。
DEFLATEアルゴリズムは、最も頻繁に遭遇する文字列に最も小さなトークンを割り当て、最も遭遇する頻度の低い文字列に大きなトークンを割り当てるという工夫を追加しました。DEFLATEアルゴリズムは、ハフマン符号化とLZ77圧縮という2つの以前の圧縮方法のアイデアも組み込んでいます。
この記事を書いている時点では、DEFLATEアルゴリズムは約30年前に開発されました。30年前は、データストレージのコストが高く、転送速度が遅かったです。データ圧縮は非常に重要でした。
今日、データストレージははるかに安く、転送速度は桁違いに速くなりました。しかし、格納するデータははるかに多く、世界中の人々がクラウドストレージやストリーミングサービスにアクセスしています。アップロードまたは転送する必要があるものを縮小したり、ローカルのハードドライブでスペースを取り戻そうとしている場合でも、データ圧縮は依然として非常に重要です。
gzipコマンド
ファイルが大きいほど、圧縮率は高くなります。これには2つの理由があります。1つは、大きなファイル全体に繰り返される同一のバイトシーケンスが多数存在することです。2つ目の理由は、圧縮解除できるように、文字列とトークンのリストを圧縮ファイルに格納する必要があることです。非常に小さなファイルでは、そのオーバーヘッドが圧縮の利点を打ち消す可能性があります。しかし、かなり小さなファイルでも、サイズが縮小される可能性があります。
ファイルを圧縮する
ファイルを圧縮(またはzip)するには、ファイルの名前をgzip
コマンドに渡すだけです。元のファイルのサイズを確認し、圧縮してから、圧縮されたファイルのサイズを確認します。
ls -lh calc-sheet.ods
gzip calc-sheet.ods
ls -lh cal-*
元のファイルは「calc-sheet.ods」というスプレッドシートで、11KBです。圧縮されたファイル(アーカイブファイルとも呼ばれます)は9.3KBです。アーカイブファイルの名前は、元のファイル名に「.gz」を付けたものになります。
ls
コマンドの最初の使用は、特定のファイル(スプレッドシート)を対象としています。ls
の2回目の使用は、「calc-」で始まるすべてのファイルを検索しますが、圧縮されたファイルのみが見つかります。これは、デフォルトでgzip
がアーカイブファイルを作成し、元のファイルを削除するためです。
これは問題ではありません。元のファイルが必要な場合は、アーカイブファイルから取得できます。ただし、元のファイルを保持したい場合は、-k
(保持)オプションを使用できます。
gzip -k calc-sheet.ods
ls -lh calc-sheet.*
今回は、元のODSファイルが保持されます。
ファイルを解凍する
GZアーカイブファイルを解凍(または解凍)するには、-d
(解凍)オプションを使用します。これにより、圧縮ファイルがアーカイブから抽出され、元のファイルと区別がつかないように解凍されます。
ls calc-sheet.*
gzip -d calc-sheet.ods.gz
ls calc-sheet.*
今回は、gzip
が元のファイルを抽出した後、アーカイブファイルを削除したことがわかります。アーカイブファイルを保持するには、-d
(解凍)オプションに加えて-k
(保持)オプションを再度使用する必要があります。
ls calc-sheet.*
gzip -d calc-sheet.ods.gz
ls calc-sheet.*
今回は、gzipがアーカイブファイルを削除しません。
解凍して上書きする
元のファイル(または同じファイル名の別のファイル)が存在するディレクトリでファイルを抽出すると、gzip
は抽出を中断するか、既存のファイルを上書きするかを選択するように求めます。
gzip -d text-file.txt.gz
アーカイブのファイルでディレクトリ内のファイルを上書きしてもよいと事前にわかっている場合は、-f(強制)オプションを使用します。
gzip -df text-file.txt.gz
ファイルは上書きされ、コマンドラインに何も表示されずに終了します。
ディレクトリツリーの圧縮
-r
(再帰的)オプションを指定すると、gzip
はディレクトリツリー全体にあるファイルを圧縮します。しかし、結果は期待したものではないかもしれません。
この例では、次のディレクトリツリーを使用します。各ディレクトリにはテキストファイルが含まれています。
tree level1
ディレクトリツリーでgzip
を使用し、どうなるかを見てみましょう。
gzip -r level1/
tree level1
結果は、gzip
がディレクトリ構造内のテキストファイルごとにアーカイブファイルを作成したことです。ディレクトリツリー全体をアーカイブしませんでした。実際、gzip
はアーカイブに1つのファイルのみ入れることができます。
ディレクトリツリーとそのすべてのファイルを含むアーカイブファイルを作成することはできますが、別のコマンドを使用する必要があります。tar
プログラムは、多くのファイルのアーカイブを作成するために使用されますが、独自の圧縮ルーチンはありません。しかし、tar
に適切なオプションを使用することで、tar
がアーカイブファイルをgzip
にプッシュするようにすることができます。そうすることで、圧縮されたアーカイブファイルと、複数のファイルまたはディレクトリのアーカイブを取得できます。
tar -czvf level1.tar.gz level1
tar
オプションは以下のとおりです。
- c: アーカイブを作成します。
- z: ファイルを
gzip
にプッシュします。 - v: 詳細モード。
tar
が何をしているかをターミナルウィンドウに出力します。 - f level1.tar.gz: アーカイブファイルに使用するファイル名。
これにより、ディレクトリツリー構造とディレクトリツリー内のすべてのファイルがアーカイブされます。
アーカイブに関する情報の取得
-l
(リスト)オプションは、アーカイブファイルに関する情報を提供します。アーカイブ内のファイルの圧縮サイズと非圧縮サイズ、圧縮率、ファイルの名前が表示されます。
gzip -l leve1.tar.gz
gzip -l text-file.txt.gz
-t
(テスト)オプションでアーカイブファイルの整合性を確認できます。
gzip -t level1.tar.gz
問題がなければ、コマンドラインに何も表示されずに終了します。何も表示されないのは、問題がないということです。
アーカイブが壊れている場合や、アーカイブでない場合は、その旨が通知されます。
gzip -t not-an-archive.gz
速度と圧縮
アーカイブの作成速度を優先するか、圧縮率を優先するかを選択できます。これを行うには、-1
から-9
までの数字をオプションとして指定します。-1
オプションは、圧縮を犠牲にして最も高速な速度を提供し、-9
は速度を犠牲にして最も高い圧縮率を提供します。
これらのオプションを指定しない限り、gzipは-6
を使用します。
gzip -1 calc-sheet.ods
ls -lh calc-sheet.ods.gz
gzip -9 calc-sheet.ods
ls -lh calc-sheet.ods.gz
gzip -6 calc-sheet.ods
ls -lh calc-sheet.ods.gz
このような小さなファイルでは、実行速度に大きな違いは見られませんでしたが、圧縮率にはわずかな違いがありました。
興味深いことに、レベル9の圧縮とレベル6の圧縮には違いがありません。どのファイルでも圧縮できる量は限られており、この場合はレベル6の圧縮でその限界に達しました。9まで上げてもファイルサイズはさらに縮小しませんでした。より大きなファイルでは、レベル6とレベル9の違いはより顕著になります。
圧縮は保護ではない
圧縮と暗号化、またはその他の保護形態を混同しないでください。ファイルを圧縮しても、セキュリティやプライバシーが向上することはありません。ファイルにアクセスできる人は誰でもgzip
を使用してファイルを解凍できます。
コメントする