Jump to content 日本-日本語

製品  >  ソフトウェア  >  HP-UX   >  Knowledge-on-Demand  >  UNIXの教科書 応用編

UNIXの教科書 応用編
〜はじめよう! WindowsとLinuxからのステップアップ〜

第4日目:ファイルの圧縮とアーカイブ

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
第4日目:ファイルの圧縮とアーカイブ
今月のテーマはファイルの圧縮・解凍と、アーカイブの管理です。1時間目にはファイルサイズを小さく圧縮するcompressとgzipの使い方を、2時間目には複数のファイルを1つにまとめて管理するtarの使い方を学びます。メールでファイルをやり取りする場合などに便利なだけではなく、インターネットで公開されているソフトウェアを利用する際にも必須の知識なので、よく理解しておきましょう。
UNIXの教科書 応用編〜はじめよう! WindowsとLinuxからのステップアップ〜 4日目
ファイルの圧縮と解凍
アーカイブの管理
2008年11月
大津 真

UNIXの教科書:登場人物紹介 このリンクをクリックすると、新しいウィンドウが開きます

マリー先生
マリー先生:
今回はファイルの圧縮・解凍と、複数のファイルを1つにまとめて管理するアーカイブの作成について説明しましょう。
その前に、前回のviエディタの操作についてなにか質問ありますか?
四色君:
viコマンドの使い方にも少しずつ慣れてきて、わりと大きなファイルでも編集できるようになってきました。 ところで、離れた場所を行き来したりするのに便利な機能があるとラクなのですが……。
四色君
マリー先生
マリー先生:
そんなときは、「m<アルファベット小文字>」コマンドでカーソル位置にマークを付けておけばいいわ。つまり、「ma」とするとカーソル位置に「a」というマークが付くの。マークした位置にジャンプするには次のいずれかを使うの。

  • '<マーク>
  • `<マーク>

ちょっと間違えやすいけど、最初の記号はシングルクォーテーション「'」で、2番目はバッククォーテーション「`」ね。前者はマークした行の行頭に、後者はカーソル位置にジャンプできるわ。
タックス君:
あっ、それは便利ですね。たとえば、現在位置とファイルの最後を行ったり来たりするには、現在位置に「ma」で「a」というマークを付けておいて、「G」で最後に移動し「`a」で戻るというのを繰り返せばよいのですね。
タックス君
マリー先生
マリー先生:
そうね。それから、マークは範囲の消去や移動にも使えるのよ。「d`<マーク>」とすれば現在位置とマークした位置の間が消去されるの。消去された範囲はバッファに格納されているから、「p」などでペーストできるわ。

今日の時間割 ファイルの圧縮と解凍 アーカイブの管理 練習問題

1時間目:ファイルの圧縮と解凍

ファイルの圧縮と言うと、WindowsにおけるZIPのように複数のファイルをまとめて圧縮するといったイメージがある方もいると思います。UNIX系でももちろんそれは可能ですが、まずはファイルを個別に圧縮する方法について説明しましょう。

compressコマンド

現在UNIXにはさまざはな圧縮コマンドがありますが、compressはもっとも伝統的な圧縮コマンドです。次のような書式で使用します。

compress ファイルのパス

「-v」オプションを指定して実行すると、圧縮率などの情報が表示されます。 たとえば、カレントディレクトリの下にある約23MBのファイル「house.bmp」をcompress形式で圧縮するには次のようにします。圧縮が完了すると元のファイルは削除され、拡張子「.Z」が付けられた圧縮ファイルが生成されます。また、元のファイルのアクセス権限や所有者、修正日時などの情報は保持されます。

$ ls -l【Enter】
$ compress -v house.bmp【Enter】
$ ls -l【Enter】

マリー先生
マリー先生:
コンピュータのファイルの圧縮方式は、可逆圧縮と非可逆圧縮の2種類があることは知っているわよね。
タックス君:
名前からすると、可逆圧縮は、圧縮ファイルを解凍して元の状態に戻せる形式で、非可逆圧縮は戻せない形式ですよね。
タックス君
マリー先生
マリー先生:
そうね。通常のデータファイルは元に戻せないと困るから可逆圧縮で圧縮されるの。それに対して、不可逆圧縮はマルチメディア系のデータで活躍しているわ。たとえば、画像フォーマットのJPEGや、音声ファイルのMP3は、人間にとって不要なデータを間引くことで高い圧縮率を実現しているかわりに、元には戻せないわけね。

圧縮ファイルの解凍

compress形式の圧縮ファイルの解凍(伸張)にはuncompressコマンドを使用します。解凍が完了すると圧縮ファイルは削除されます。

$ ls -l【Enter】
total 38416
-rw-------   1 o2         users      19664562 Oct 21 15:57 house.bmp.Z
$ uncompress house.bmp.Z
$ ls -l【Enter】
total 46832
-rw-------   1 o2         users      23970870 Oct 21 15:57 house.bmp

マリー先生
マリー先生:
compressコマンドに「-d」オプションをつけて実行しても、ファイルの解凍ができるのよ。
四色君:
それではuncompressコマンドの存在はディスクの無駄ではないのですか?
四色君
マリー先生
マリー先生:
そんなことはないわ。実はcompressコマンドとuncompressコマンドは同じ実体、つまりハードリンクなの。次のように「ls -il」コマンドを実行するとiノード番号が同じであることがわかるわ。

$ ls -il /usr/bin/compress /usr/bin/uncompress【Enter】
タックス君:
同じコマンドを、呼び出したコマンド名によって処理を切り分けているわけですね。
タックス君
マリー先生
マリー先生:
そうね。UNIXにはそのようなコマンドがいくつかあるわ。たとえば、grepファミリーのgrep、egrep、fgrepなんかもそうね。

$ ls -il /usr/bin/grep /usr/bin/egrep /usr/bin/fgrep【Enter】


ワイルドカードによるファイル指定

compressコマンドの引数に複数のファイルを指定して、一度に圧縮することも可能です。もちろん、「*」(0個以上の任意の文字列)や「?」(任意の1文字)といったシェルのワイルドカードも使用できます。たとえば、Documentsディレクトリの下の拡張子が「.txt」のファイルをまとめて圧縮するには次のようにします。

$ ls -l Documents/【Enter】
total 96
drwxr-x---   2 o2         users           96 Aug 24 23:00 2007
drwxr-x---   2 o2         users         8192 Aug 24 23:35 2008
-rw-r-----   1 o2         users        12526 Oct 21 16:15 info.txt
-rw-r-----   1 o2         users         5023 Oct 21 16:16 mail.txt
-rw-r-----   1 o2         users          553 Oct 21 16:18 main.html
drwxr-x---   2 o2         users           96 Aug 24 23:03 sample
-rw-r-----   1 o2         users           25 Aug 24 22:59 sample.txt
$ compress Documents/*.txt
$ ls -l Documents/【Enter】
total 80
drwxr-x---   2 o2         users           96 Aug 24 23:00 2007
drwxr-x---   2 o2         users         8192 Aug 24 23:35 2008
-rw-r-----   1 o2         users         5517 Oct 21 16:15 info.txt.Z
-rw-r-----   1 o2         users         2482 Oct 21 16:16 mail.txt.Z
-rw-r-----   1 o2         users          553 Oct 21 16:18 main.html
drwxr-x---   2 o2         users           96 Aug 24 23:03 sample
-rw-r-----   1 o2         users           25 Aug 24 22:59 sample.txt

四色君:
あれ? sample.txtが圧縮されずにそのまま残っていますけど……。
四色君
マリー先生
マリー先生:
圧縮してもファイルサイズが小さくならない場合、compressはそのファイルを無視してそのまま残すの。「-f」オプションを付けるとそういうファイルも強制的に圧縮できるけれど、このオプションを付けると圧縮後のファイル名と同じファイルがあった場合にも確認せずに上書きされてしまうから注意してね。

同じように、uncompressコマンドで解凍する場合もワイルドカードが使えます。Documentsディレクトリの下にあるcompress形式の圧縮ファイルをすべて解凍するには、引数に「 Documents/*.Z」を指定します。

$ uncompress Documents/*.Z

ディレクトリをたどって圧縮する

指定したディレクトリを再帰的にたどって、すべてのファイルを圧縮するにはどうしたらよいでしょうか?

ディレクトリの下にあるファイルをすべて圧縮するには?
図1:ディレクトリの下にあるファイルをすべて圧縮するには?

これは、findコマンドとcompressコマンドを組み合わせることによって実現できます。たとえばDocumentsディレクトリ以下のサブディレクトリをたどってすべてのファイルを圧縮するには、次のようにします。

$ find Documents/ -type f | xargs compress

もしくは

$ find Documents/ -type f -exec compress {} \;

実は、いつもこのような長いコマンドを実行しなくてもすむように、HP-UXにはcompressdirとuncompressdirという便利なコマンドも用意されています。


マリー先生
マリー先生:
compressdirとuncompressdirは、普通のコマンドのようなバイナリファイルではなくてテキストファイルなの。
四色君:
テキストファイルがコマンドなのですか?
四色君
マリー先生
マリー先生:
そう。実際にcompressdir(/usr/bin/compressdir)の中をのぞいてみるとわかるけど、シェルのコマンドが羅列されたテキストファイルなの。シェルというのはユーザのコマンドを解釈するコマンドインタプリタとしての役割だけではなく、プログラミング言語でもあるのよ。そのようなシェルによって記述したプログラムのことを「シェルスクリプト」と呼ぶので覚えておいてね。

gzipコマンドによる圧縮

compressは古くからあるコマンドで、ほとんどのUNIX系OSに搭載されていますが、あまり圧縮率が高くありません。そのため、gzipというオープンソースの圧縮プログラムも普及していきます。gzip このリンクをクリックすると、HP社外へリンクします。は最近のHP-UXには標準搭載されています。
前述のcompressコマンドの例で使用したカレントディレクトリの下にある約23MBのファイル「house.bmp」をcompress形式で圧縮するには、次のようにします。

$ ls -l【Enter】
total 46832
-rw-------   1 o2         users      23970870 Oct 21 15:57 house.bmp
$ gzip -v house.bmp【Enter】
$ ls -l【Enter】
total 35360
-rw-------   1 o2         users      18103138 Oct 21 15:57 house.bmp.gz

gzip形式の圧縮ファイルを解凍するには、gunzipコマンド(もしくは「gzip -d 」)を使用します。

$ gunzip house.bmp.gz
$ ls -l【Enter】
total 46832
-rw-------   1 o2         users      23970870 Oct 21 15:57 house.bmp

なお、gunzip(もしくは「gzip -d 」)ではcompress形式の圧縮ファイルを解凍することもできます。

マリー先生
マリー先生:
gzipは、GNUプロジェクトというフリーのUNIX互換OSを目指すプロジェクトのプロダクトなの。GNUのプロダクトはオープンソースのはしりのようなもので、GPLというライセンスに従ってソースコードが公開されていて、だれでも自由に利用できるの。
タックス君:
GNUというとLinuxを思い出しますが……。
タックス君
マリー先生
マリー先生:
そうね、狭義のLinuxはカーネル部分だけで、コンパイラやコマンド群などの多くはGNUのプロダクトを利用しているの。

休憩時間:GNUプロジェクト

近年のオープンソース・ソフトウエア・ブームを語る上で欠かすことのできない存在がGNUプロジェクト このリンクをクリックすると、HP社外へリンクします。です。GNUプロジェクトはUNIX互換OSをすべてフリーソフトウエアで実装することを目指して、リチャード・ストールマン氏を中心に1984年に設立されました。
たとえば、現在さまざまな環境で広く使われている、GCC(コンパイラ)、bash(高機能シェル)、emacs(エディタ)などはGNUのプロダクトです。
また、オープンソースソフトウエアのライセンスとして広く普及しているGPL(GNU General Public License)も、元々はGNUプロジェクトで作成したソフトウェアの配布のために制定されたものです。

GNUプロジェクト
図2:GNUプロジェクト

連載記事一覧 1  |  2 次のページへ

本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

HPEサポートセンター
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項