PR

【Ubuntu】gzipを使って圧縮・解凍する方法

Ubuntuで「gzip」を使ってデータを圧縮・解凍(展開)する方法です。

圧縮

ファイルを指定して「gzip」コマンドを実行することで、ファイルを圧縮することが出来ます。

圧縮前のファイルは「ファイル.gz」という名前の圧縮ファイルに変換されます。(元のファイルは残りません)

gzip ファイル

「100MB.txt」というファイルを「gzip」で圧縮します。

$ gzip 100MB.txt 

圧縮前の「100MB.txt」は「100MB.txt.gz」という圧縮ファイルに変化されました。

$ ls -lh
total 76M
-rw-rw-r-- 1 tamohiko tamohiko 76M Feb 11 17:18 100MB.txt.gz

ディレクトリを圧縮したい場合

「gzip」にはディレクトリを直接圧縮する機能がないので、一度「tar」でアーカイブしてあげる必要が有ります。

tar cfv ディレクトリ.tar ディレクトリ
gzip ディレクトリ.tar

「file_dir」という下記ファイルを含んだディレクトリを、「tar」でアーカイブしたあとに「gzip」で圧縮してみます。

$ ls -Rlh file_dir/
file_dir/:
total 301M
-rw-rw-r-- 1 tamohiko tamohiko 100M Feb 11 17:18 100MB.txt
-rw-rw-r-- 1 tamohiko tamohiko 200M Feb 11 22:27 200MB.txt

「file_dir」を「file_dir.tar」という名前で「tar」を使ってアーカイブします。

$ tar cfv file_dir.tar file_dir/
file_dir/
file_dir/100MB.txt
file_dir/200MB.txt

「file_dir.tar」というアーカイブされたファイルが作成されました。

$ ls -lh
total 301M
drwxrwxr-x 2 tamohiko tamohiko 4.0K Feb 11 22:53 file_dir
-rw-rw-r-- 1 tamohiko tamohiko 301M Feb 11 22:54 file_dir.tar

アーカイブされた「file_dir.tar」を「gzip」で圧縮します。

$ gzip file_dir.tar 

これで、「file_dir」を圧縮した「file_dir.tar.gz」というファイルを作成することが出来ました。

$ ls -lh
total 228M
drwxrwxr-x 2 tamohiko tamohiko 4.0K Feb 11 22:53 file_dir
-rw-rw-r-- 1 tamohiko tamohiko 228M Feb 11 22:54 file_dir.tar.gz

tarのzオプションを使ってアーカイブと圧縮を一度に行う方法

「tar」のオプションには、アーカイブを行う際に「gzip」で圧縮も行う「z」という便利なオプションが有ります。

「z」オプションを使うことで、下記のように1度のコマンドでディレクトリを圧縮することが出来るようになります。

$ tar cfzv file_dir.tar.gz file_dir/
file_dir/
file_dir/100MB.txt
file_dir/200MB.txt

下記のように「file_dir」ディレクトリを、「file_dir.tar.gz」という名前で圧縮することができました。

$ ls -lh
total 228M
drwxrwxr-x 2 tamohiko tamohiko 4.0K Feb 11 22:53 file_dir
-rw-rw-r-- 1 tamohiko tamohiko 228M Feb 11 22:56 file_dir.tar.gz

複数のファイルをまとめて圧縮

「gzip」には複数のファイルをまとめて圧縮する機能はありません。

ですので、ディレクトリを圧縮する場合と同様に「tar」で複数のファイルをアーカイブしてから「gzip」で圧縮を行う必要が有ります。

tar cfv アーカイブファイル.tar ファイル_1 ファイル_2
gzip アーカイブファイル.tar

「100MB.txt」と「200MB.txt」というファイルをアーカイブして圧縮します。

$ ls -lh
total 301M
-rw-rw-r-- 1 tamohiko tamohiko 100M Feb 11 17:18 100MB.txt
-rw-rw-r-- 1 tamohiko tamohiko 200M Feb 11 22:27 200MB.txt

まずは「tar」でアーカイブします。

$ tar cfv text_file.tar 100MB.txt 200MB.txt 
100MB.txt
200MB.txt

「text_file.tar」というアーカイブされたファルが作成されました。

$ ls -lh
total 601M
-rw-rw-r-- 1 tamohiko tamohiko 100M Feb 11 17:18 100MB.txt
-rw-rw-r-- 1 tamohiko tamohiko 200M Feb 11 22:27 200MB.txt
-rw-rw-r-- 1 tamohiko tamohiko 301M Feb 12 16:51 text_file.tar

アーカイブされた「text_file.tar」を「gzip」で圧縮します。

$ gzip text_file.tar 

これで「100MB.txt」と「200MB.txt」と「200MB.txt」の2つのファイルを「text_file.tar.gz」という名前で圧縮することが出来ました。

$ ls -lh
total 528M
-rw-rw-r-- 1 tamohiko tamohiko 100M Feb 11 17:18 100MB.txt
-rw-rw-r-- 1 tamohiko tamohiko 200M Feb 11 22:27 200MB.txt
-rw-rw-r-- 1 tamohiko tamohiko 228M Feb 12 16:53 text_file.tar.gz

tarのzオプションを使ってアーカイブと圧縮を一度に行う方法

「tar」の「z」オプションを使うことで、ディレクトリ圧縮の項目でも説明したように1度のコマンドで複数ファイルのアーカイブと圧縮を同時に行うことが出来ます。

「100MB.txt」と「200MB.txt」を「text_file_2.tar.gz」という名前で、アーカイブと圧縮を同時に行ってみます。

$ tar cfzv text_file_2.tar.gz 100MB.txt 200MB.txt 
100MB.txt
200MB.txt

アーカイブと圧縮を行うことができました。

$ ls -lh
total 756M
-rw-rw-r-- 1 tamohiko tamohiko 100M Feb 11 17:18 100MB.txt
-rw-rw-r-- 1 tamohiko tamohiko 200M Feb 11 22:27 200MB.txt
-rw-rw-r-- 1 tamohiko tamohiko 228M Feb 12 16:53 text_file.tar.gz
-rw-rw-r-- 1 tamohiko tamohiko 228M Feb 12 16:55 text_file_2.tar.gz

圧縮前のファイルを残したい

オプションを指定せずに「gzip」で圧縮を行うと、元のファイルは圧縮後のファイルに変換されて残りません。

圧縮前のデータを残して置きたい場合もあると思うので、圧縮前のデータを残したまま圧縮データを作成するための方法を2パターン紹介します。

  • -k オプションを使用
  • -c オプションを使用

-kオプションを使用

「-k」オプションを使用すると、元のファイルを残したまま圧縮を行うことが出来ます。

$ gzip -k 100MB.txt 

下記のように、圧縮前のファイルを残しながら圧縮されたファイルが作成されました。

$ ls -lh
total 177M
-rw-rw-r-- 1 tamohiko tamohiko 100M Feb 11 17:18 100MB.txt
-rw-rw-r-- 1 tamohiko tamohiko  76M Feb 11 17:18 100MB.txt.gz

-c オプションを使用

「-c」オプションは、圧縮結果を標準出力に出力させるオプションです。

標準出力に出力された結果を「>」(リダイレクト)でファイルに出力することで、圧縮ファイルを作成することが出来ます。

出力するファイル名を指定できるので、圧縮後のファイル名を任意の名前に変更したい場合等は「-c」オプションを使用します。

gzip -c 圧縮対象ファイル > 圧縮後のファイル名

「-c」オプションを使用して「100MB.txt」を「100MB.txt_bk.gz」という名前で圧縮してみます。

$ gzip -c 100MB.txt > 100MB.txt_bk.gz

圧縮前のファイルを残しつつ「100MB.txt_bk.gz」という名前でファイルを圧縮することが出来ました。

$ ls -lh
total 176M
-rw-rw-r-- 1 tamohiko tamohiko 100M Feb 11 17:18 100MB.txt
-rw-rw-r-- 1 tamohiko tamohiko  76M Feb 12 18:26 100MB.txt_bk.gz
圧縮ファイルの作成場所も指定できます

「-c」オプションを使うと、ファイル名だけではなく作成先のパスもあわせて指定することで、圧縮ファイルを作成するディレクトリも指定できます。

gzip -c 圧縮対象ファイル > /ディレクトリ/圧縮ファイル.gz

下記の例では一つ上の階層にある「backup」というディレクトリに、「100MB.txt.bk.gz」という名前で圧縮したファイルを作成しています。

$ gzip -c 100MB.txt > ../bakcup/100MB.txt.bk.gz
$ ls -lh ../bakcup/
total 76M
-rw-rw-r-- 1 tamohiko tamohiko 76M Feb 12 18:43 100MB.txt.bk.gz

解凍

「gzip」で圧縮されたファイルを解凍(展開)する場合は、「-d」オプションを使用します。

ファイルの解凍を行うと、圧縮されていたファイルは解凍後のファイルに変換されます。(圧縮の時と同じように元のファイルは残りません)

gzip -d 解凍対象データ.gz

「100MB.txt.gz」という「gzip」で圧縮されたファイルを「-d」オプションを使って解凍します。

$ ls -lh 
total 76M
-rw-rw-r-- 1 tamohiko tamohiko 76M Feb 11 17:18 100MB.txt.gz
$ gzip -d 100MB.txt.gz

解凍を行うと「100MB.txt」というファイルに変換されて、解凍前の「100MB.txt.gz」ファイルは無くなります。

$ ls -lh
total 101M
-rw-rw-r-- 1 tamohiko tamohiko 100M Feb 11 17:18 100MB.txt

解凍前のファイルを残したい場合

解凍前のファイルを残したい場合は、圧縮の場合と同様に「-k」か「-c」オプションを使用します。

gzip -d -k 解凍対象ファイル.gz
gzip -d -c 解凍対象ファイル.gz > 解凍後ファイル

-k オプションを使用

「-k」オプションを使用して「100MB.txt.gz」ファイルを解凍します。

$ gzip -d -k 100MB.txt.gz

解凍前の「100MB.txt.gz」ファイルを残して、「100MB.txt」というファイルが解凍されて作成されました。

$ ls -lh
total 176M
-rw-rw-r-- 1 tamohiko tamohiko 100M Feb 11 17:18 100MB.txt
-rw-rw-r-- 1 tamohiko tamohiko  76M Feb 11 17:18 100MB.txt.gz

-c オプションを使用

ファイルを圧縮する場合と同様に「-c」オプションを使うことで、解凍前のファイルを残しつつ解凍後のファイル名や保存場所を指定することが出来ます。

下記の実行例では「100MB.txt.gz」というファイルを、ひとつ上の階層にある「backup」ディレクトリに「100MB.txt」という名前で解凍しています。

$ gzip -d -c 100MB.txt.gz > ../bakcup/100MB.txt
$ ls -lh ../bakcup/
total 101M
-rw-rw-r-- 1 tamohiko tamohiko 100M Feb 12 19:06 100MB.txt

tarでアーカイブされているデータ(tar.gz tgz)を解凍・展開

「tar.gz」などの「tar」でアーカイブされているデータを「gzip」で圧縮したファイルを解凍・展開するには、「tar」の「xfzv」オプションを使用します。

「v」オプションは、コマンド実行時に詳細な情報を表示させるためのオプションであるので、使用しなくても解凍・展開することは出来ます。

tar xfzv 解凍対象データ.tar.gz

実際に「file_dir.tar.gz 」というファイルを解凍・展開してみます。

$ tar xzfv file_dir.tar.gz 
file_dir/
file_dir/100MB.txt
file_dir/200MB.txt

解凍・展開後を確認してみると「file_dir」というディレクトリが出てきました。

$ ls -lh
total 228M
drwxrwxr-x 2 tamohiko tamohiko 4.0K Feb 11 22:53 file_dir
-rw-rw-r-- 1 tamohiko tamohiko 228M Feb 11 22:56 file_dir.tar.gz

gzip -d で解凍してからアーカイブを展開

下記のように一度「gzip -d」で解凍してから、「tar xfv」でアーカイブを展開することも出来ます。

$ gzip -d -k file_dir.tar.gz

「file_dir.tar.gz」が解凍されて、「file_dir.tar」というアーカイブされたファイルが出てきました。

$ ls -lh
total 529M
-rw-rw-r-- 1 tamohiko tamohiko 301M Feb 11 22:56 file_dir.tar
-rw-rw-r-- 1 tamohiko tamohiko 228M Feb 11 22:56 file_dir.tar.gz

「tar xfv」でアーカイブされている「file_dir.tar」を展開します。

$ tar xfv file_dir.tar
file_dir/
file_dir/100MB.txt
file_dir/200MB.txt

アーカイブを展開すると「file_dir」ディレクトリが出てきました。

$ ls -lh
total 529M
drwxrwxr-x 2 tamohiko tamohiko 4.0K Feb 11 22:53 file_dir
-rw-rw-r-- 1 tamohiko tamohiko 301M Feb 11 22:56 file_dir.tar
-rw-rw-r-- 1 tamohiko tamohiko 228M Feb 11 22:56 file_dir.tar.gz

オプションの説明

「gzip」を使用する際に使用することが多いオプションについて説明します。

オプション 説明
-1 〜 -9 圧縮レベルを指定
-c 標準出力に結果を表示
他のコマンドと組み合わせて使用することが多い
-l 圧縮前と後のファイルサイズ・圧縮率・解凍後のファイル名を表示
-r ディレクトリ内のファイルを圧縮する際に使用
-t 圧縮ファイルが破損していないかを確認
-v 詳細な情報を表示

-1 〜 -9圧縮レベルを指定

「1〜9」の数字をオプションとして指定することで、圧縮のレベルを指定することができます。

  • -1: 圧縮率最小 圧縮スピード最速
  • -9: 圧縮率最大 圧縮スピード最遅

無指定の場合は「-6」が指定されていることになります。

テスト用に用意した「vpslife.tar」というファイルを使い、「-1」と「-9」ではどのくらい圧縮率に差が出るか比較してみます。

$ ls -lh vpslife.tar 
-rw-r--r-- 1 tamohiko tamohiko 209M Feb 12 00:00 vpslife.tar

最小値である「-1」、デフォルトの設定である「-6」、最高値である「-9」の3パターンで圧縮を行い圧縮後のサイズを比較してみます。

$ gzip -1 -c vpslife.tar > vpslife_1.tar.gz
$ gzip -9 -c vpslife.tar > vpslife_9.tar.gz 
$ gzip -6 -c vpslife.tar > vpslife_6.tar.gz

以下が、圧縮後のファイルサイズとなりますが、「-1」と「-9」を比較すると違いはありますが、デフォルト設定の「-6」と「-9」ではそこまでの差は見られないようです。

$ ls -l vpslife*
-rw-r--r-- 1 tamohiko tamohiko 218480640 Feb 12 00:00 vpslife.tar
-rw-rw-r-- 1 tamohiko tamohiko 101337754 Feb 13 00:02 vpslife_1.tar.gz
-rw-rw-r-- 1 tamohiko tamohiko  93719708 Feb 13 00:04 vpslife_6.tar.gz
-rw-rw-r-- 1 tamohiko tamohiko  93446371 Feb 13 00:02 vpslife_9.tar.gz

「time」コマンドで圧縮レベル毎に圧縮に掛かった時間を計測してみた結果です。

real部分に表示されている時間が圧縮に掛かった時間になります。

$ time gzip -1 -c vpslife.tar > vpslife_1.tar.gz

real	0m8.390s
user	0m7.548s
sys	0m0.244s

$ time gzip -6 -c vpslife.tar > vpslife_6.tar.gz

real	0m16.372s
user	0m13.893s
sys	0m0.315s

$ time gzip -9 -c vpslife.tar > vpslife_9.tar.gz

real	0m20.093s
user	0m19.043s
sys	0m0.180s

「-6」と「-9」では、圧縮後のファイルサイズはそこまで大きな違いはないのですが、圧縮に掛かった時間には差が出る結果となりました。

圧縮するファイル数が多くなると時間に差が大きく出てくるので、圧縮後のサイズを取るか、圧縮に掛かる時間を取るかの選択を行ってください。

-c 標準出力に結果を表示

「-c」オプションを使用すると、圧縮・解凍されたデータを標準出力へ書き出すことができます。

ここでは、私がよく使用する「-c」オプションの使い方を紹介します。

別のファイルにリダイレクト

標準出力への出力結果を「>」リダイレクトすることで、別のファイルに書き出すことが出来ます。

下記の例では、「fruit.txt」を「fruit_bk.txt.gz」名前で圧縮し、その後「fruit_backup.txt」という名前で解凍しています。

$ gzip -c fruit.txt > fruit_bk.txt.gz
$ gzip -d -c fruit_bk.txt.gz > fruit_backup.txt

「|」(パイプ)で別コマンドに渡す

次に紹介するのが、「|」(パイプ)を使って別のコマンドに渡すという使い方です。

実行例として「fruit_bk.txt.gz」を解凍し、その結果を「|」(パイプ)で「grep」に渡しています。

こうすることで、解凍したファイルを作成することなく処理を行うことが出来ます。

$ gzip -d -c fruit_bk.txt.gz | grep -e Apple -e Banana
Apple
Banana

ちなみに、圧縮前のファイルは以下の内容が記述されています。

$ cat fruit.txt
Apple
Orange
Banana
Watermelon
strawberry

-l 圧縮前と後のファイルサイズ・圧縮率・解凍後のファイル名を表示

「-l」オプションを使用すると、圧縮されたファイルの下記情報を表示することが出来ます。

  • compressed: 圧縮後のサイズ
  • uncompressed: 圧縮前のサイズ
  • ratio: 圧縮率
  • uncompressed_name: 解凍後のファイル名
gzip -l 圧縮ファイル

以下は、「100MB-1.txt.gz」と「100MB-9.txt.gz」というファイルの情報を表示させた例となります。

$ gzip -l 100MB-1.txt.gz 
         compressed        uncompressed  ratio uncompressed_name
           81389520           104857600  22.4% 100MB-1.txt

$ gzip -l 100MB-9.txt.gz 
         compressed        uncompressed  ratio uncompressed_name
           79685224           104857600  24.0% 100MB-9.txt

-r ディレクトリ内のファイルを圧縮する際に使用

「-r」オプションを使用すると、ディレクトリ内にあるファイルを全て圧縮することが出来ます。

gzip -r ディレクトリ

動作検証のために下記構成のディレクトリとファイルを用意しました。

$ tree ./dir_01/
./dir_01/
|-- sub_dir
|   |-- test_04.txt
|   `-- test_05.txt
|-- test_01.txt
|-- test_02.txt
`-- test_03.txt

2 directories, 5 files

「./dir_01」ディレクトリに対して「-r」オプションを使用して、中身のファイルに対して圧縮を行ってみます。

$ gzip -r ./dir_01/

「gzip -r」を実行した結果が下記の内容となります。

「./dir_01」ディレクトリの中にあるファイルが、サブディレクトリ内にあるもの含めてすべて圧縮されました。

$ tree ./dir_01/
./dir_01/
|-- sub_dir
|   |-- test_04.txt.gz
|   `-- test_05.txt.gz
|-- test_01.txt.gz
|-- test_02.txt.gz
`-- test_03.txt.gz

2 directories, 5 files

「-r」オプションはファイルのみを圧縮するのであって、ディレクトリ自体は圧縮してくれませんので注意してください。

-t 圧縮ファイルが破損していないかを確認

「-t」オプションを使用すると圧縮されたファイルに破損が無いか確認を行うことが出来ます。

gzip -t 圧縮ファイル

正常な例

実際に圧縮されたファイルの確認を行ってみます。

ファイルに問題がなければ、下記のように特に何も表示されません。

$ gzip -t 100MB-1.txt.gz

「-v」オプションもあわせて使用すると、「100MB-1.txt.gz: OK」といったメッセージが表示されます。

$ gzip -tv 100MB-1.txt.gz 
100MB-1.txt.gz:	 OK

破損がある場合

圧縮されたファイルに破損がある場合は、下記のようにエラーメッセージが表示されます。

$ gzip -t 100MB-9.txt.gz 

gzip: 100MB-9.txt.gz: invalid compressed data--crc error

gzip: 100MB-9.txt.gz: invalid compressed data--length error

「-v」オプションも合わせて使用した場合は下記のように表示されます。

$ gzip -tv 100MB-9.txt.gz 
100MB-9.txt.gz:	
gzip: 100MB-9.txt.gz: invalid compressed data--crc error

gzip: 100MB-9.txt.gz: invalid compressed data--length error

-v 詳細情報を表示

「-v」オプションを使用すると、ファイルの圧縮・解凍時に以下の情報を表示してくれます。

  • 圧縮・解凍対象のファイル名
  • 圧縮率
  • 圧縮・解凍後のファイル名
$ gzip -v 100MB.txt 
100MB.txt:	 24.0% -- replaced with 100MB.txt.gz

$ gzip -d -v 100MB.txt.gz
100MB.txt.gz:	 24.0% -- replaced with 100MB.txt

コメント

タイトルとURLをコピーしました