3.1 レッスン 1
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
3 コマンドラインの力 |
Objective: |
3.1 コマンドラインでファイルをアーカイブする |
Lesson: |
1 of 1 |
はじめに
データセットが消費する容量を減らすために、圧縮を使用します。つまり、ファイルを保存するのに必要な容量を減らことが最も一般的な目的です。また、ネットワーク経由で送信するデータの量を減らすことも目的のひとつです。
圧縮は、データ内に繰り返し現れるパターンを置き換えることで行われます。小説があるとしましょう。“the” のように、複数の文字から成る単語が頻繁に使われています。このような複数文字から成る単語やパターンを、1文字で置き換えれば、小説全体のサイズを大幅に縮小することができます。例えば、“the” を他では使用されていないギリシャ文字1つで置き換えます。データ圧縮には、これに似たもっともっと複雑なアルゴリズムが使われています。
圧縮には、可逆圧縮(ロスレス)と 非可逆圧縮 (ロッシー)の2種類があります。可逆アルゴリズムで圧縮されたものは、元の形に復元できます。非可逆アルゴリズムで圧縮されたデータは復元できません。非可逆アルゴリズムは、画像、ビデオ、オーディオなどによく使用されます。この場合、内容は同じままで品質がわずかに低下しますが、劣化は人間には知覚できないか、あるいは節約された容量やネットワークスループットに見合うものです。
複数のファイルやディレクトリを1つのファイルにまとめるために、アーカイブツールを使用します。一般的には、バックアップ、ソフトウェアソースコードや、データなどの取りまとめといった用途に使われます。
アーカイブと圧縮は同時に使用することが多いものです。一部のアーカイブツールは、デフォルトでコンテンツを圧縮します。またあるものは、オプションでコンテンツを圧縮できます。いくつかのアーカイブツールで、コンテンツを圧縮する場合は独立した圧縮ツールと組み合わせて使用するものもあります。
Linuxシステムでファイルをアーカイブするためには、tar
を最も一般的に使用します。ほとんどのLinuxディストリビューションには、GNU版の tar
が含まれているため、それをこのレッスンで取り上げます。tar
は、それ自体ではファイルのアーカイブのみを管理し、ファイルの圧縮は行いません。
Linuxではたくさんの圧縮ツールが利用できます。可逆圧縮の一般的なものとして、bzip2
、gzip
、および xz
があります。ほとんどのシステムには3つすべてが搭載されていますが、古いシステムや非常に小さなシステムなどには、xz
や bzip2
がインストールされていないこともあります。普通にLinuxを使っていると、これら3種すべてがファイルを圧縮するために使われていることに気づくでしょう。 3つとも異なるアルゴリズムを使用しているため、あるツールで圧縮されたファイルを別のツールで伸張することはできません。圧縮ツールにはトレードオフがあります。高い圧縮率が必要な場合は、ファイルの圧縮と伸張に時間がかかります。なぜなら、圧縮率を高めるためには、複雑なパターンを見つけるために多くの作業が必要になるからです。これらのツールはすべて、データを圧縮しますが、複数のファイルをまとめたアーカイブを作成することはできません。
普通のWindowsシステムには、単体の圧縮ツールが備わっていません。Windowsでは、アーカイブツールと圧縮ツールは1つに組み合わされています。LinuxシステムとWindowsシステムの間でファイルを共有する必要がある場合は、これを覚えておきましょう。
Linuxシステムには、Windowsシステムで一般的に使用される .zip
ファイルを処理するためのツールも備わっていて、zip
および unzip
と呼ばれます。これらのツールはすべてのシステムにデフォルトでインストールされるわけではないので、使う前にインストールしなくてはいけないことがあります。幸いなことに、通常はディストリビューションのパッケージリポジトリに、これらのツールがあります。
圧縮ツール
ファイルの圧縮によって節約されるディスク容量は、いくつかの要因によって異なります。圧縮するデータの性質、データの圧縮に使用するアルゴリズムと圧縮レベルなどです。アルゴリズムによっては、圧縮レベルをサポートしていないものもあります。
圧縮するテストファイルの準備から始めましょう:
$ mkdir ~/linux_essentials-3.1 $ cd ~/linux_essentials-3.1 $ mkdir compression archiving $ cd compression $ cat /etc/* > bigfile 2> /dev/null
これらのファイルのコピーを3つ作ります:
$ cp bigfile bigfile2 $ cp bigfile bigfile3 $ cp bigfile bigfile4 $ ls -lh total 2.8M -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile2 -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile3 -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile4
さぁ、これらのファイルを前述の圧縮ツールで圧縮してみましょう:
$ bzip2 bigfile2 $ gzip bigfile3 $ xz bigfile4 $ ls -lh total 1.2M -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile -rw-r--r-- 1 emma emma 170K Jun 23 08:08 bigfile2.bz2 -rw-r--r-- 1 emma emma 179K Jun 23 08:08 bigfile3.gz -rw-r--r-- 1 emma emma 144K Jun 23 08:08 bigfile4.xz
圧縮ファイルのサイズを、bigfile
という名前の非圧縮ファイルと比較します。また、圧縮ツールがファイル名にサフィックスを追加し、非圧縮ファイルを削除したことにも注意してください。
bunzip2
、gunzip
、unxz
を使って、ファイルを伸張します:
$ bunzip2 bigfile2.bz2 $ gunzip bigfile3.gz $ unxz bigfile4.xz $ ls -lh total 2.8M -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile2 -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile3 -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile4
伸張すると圧縮ファイルが削除されることにも注意しましょう。
一部の圧縮ツールは、いくつかの圧縮レベルをサポートしています。圧縮レベルを高くするとより多くのメモリと実行時間が必要になりますが、圧縮ファイルは小さくなります。低いレベルでは逆になります。以下に xz
と gzip
を使った例を示します:
$ cp bigfile bigfile-gz1 $ cp bigfile bigfile-gz9 $ gzip -1 bigfile-gz1 $ gzip -9 bigfile-gz9 $ cp bigfile bigfile-xz1 $ cp bigfile bigfile-xz9 $ xz -1 bigfile bigfile-xz1 $ xz -9 bigfile bigfile-xz9 $ ls -lh bigfile bigfile-* * total 3.5M -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile -rw-r--r-- 1 emma emma 205K Jun 23 13:14 bigfile-gz1.gz -rw-r--r-- 1 emma emma 178K Jun 23 13:14 bigfile-gz9.gz -rw-r--r-- 1 emma emma 156K Jun 23 08:08 bigfile-xz1.xz -rw-r--r-- 1 emma emma 143K Jun 23 08:08 bigfile-xz9.xz
ファイルを使用するたびに、伸張する必要はありません。通常、圧縮ツールにはテキストファイルを読み出すための特別なバージョンのツールが用意されています。たとえば、gzip
には、cat
、grep
、diff
、less
、more
などに相当するバージョンがあります。gzip
の場合、それらのツールには接頭辞(プレフィックス)z
が付き、bzip2
には接頭辞 bz
、xz
には接頭辞 xz
がつきます。zcat
を使って、gzip
で圧縮されたファイルを読み取って表示する例を示します:
$ cp /etc/hosts ./ $ gzip hosts $ zcat hosts.gz 127.0.0.1 localhost # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters
アーカイブツール
tar
プログラムは、Linux システムで最も広く使われているアーカイブツールです。なぜそのような名前がついているのか不思議に思うかもしれませんが、これは “テープアーカイブ” (Tape ARchive)の略で、tar
で作成されたファイルを tarボール と呼ぶことがあります。ソースコードで配布されているアプリケーションが、 tar ボールに入っていることはとても一般的です。
Linuxディストリビューションに同梱されているGNUバージョンの tar
には、多くのオプションがあります。このレッスンでは、よく使われる一部について説明します。
まず、圧縮に使用するファイルのアーカイブを作成しましょう:
$ cd ~/linux_essentials-3.1 $ tar cf archiving/3.1.tar compression
tar
の c
オプションは新しいアーカイブファイルの作成を指示し、f
オプションは作成するファイルの名前です。オプションの直後の引数は、常に作業するファイルの名前になります。 残りの引数は、ファイルに追加したいか、ファイルから抽出したい、あるいは一覧表示したい、ファイルやディレクトリへのパスです。この例では、ディレクトリ compression
とそのすべての内容をアーカイブに追加しています。
tarボールの内容を見るには、t
オプションを使います:
$ tar -tf 3.1.tar compression/ compression/bigfile-xz1.xz compression/bigfile-gz9.gz compression/hosts.gz compression/bigfile2 compression/bigfile compression/bigfile-gz1.gz compression/bigfile-xz9.xz compression/bigfile3 compression/bigfile4
オプションの前に -
があることに着目しましょう。ほとんどのプログラムとは異なり、tar
ではオプションに -
を指定する必要はありませんが、あっても害にはなりません。
Note
|
|
では、ファイルを取り出してみましょう:
$ cd ~/linux_essentials-3.1/archiving $ ls 3.1.tar $ tar xf 3.1.tar $ ls 3.1.tar compression
アーカイブから1つだけファイルを取り出したいとしましょう。その場合、アーカイブのファイル名の後に、取り出すファイルを指定します。必要があれば複数のファイルを指定することもできます。
$ cd ~/linux_essentials-3.1/archiving $ rm -rf compression $ ls 3.1.tar $ tar xvf 3.1.tar compression/hosts.gz compression/ compression/bigfile-xz1.xz compression/bigfile-gz9.gz compression/hosts.gz compression/bigfile2 compression/bigfile compression/bigfile-gz1.gz compression/bigfile-xz9.xz compression/bigfile3 compression/bigfile4 $ ls 3.1.tar compression $ ls compression hosts.gz
tar
ファイルには、絶対パス( /
で始まるパス)を除いて、作成時のファイルへのパス全体が格納されます。単一のディレクトリのみを指定してファイル 3.1.tar
を作成したので、抽出時には作業ディレクトリに相対でそのディレクトリが作成されます。別の例で、これを見てみましょう:
$ cd ~/linux_essentials-3.1/archiving $ rm -rf compression $ cd ../compression $ tar cf ../tar/3.1-nodir.tar * $ cd ../archiving $ mkdir untar $ cd untar $ tar -xf ../3.1-nodir.tar $ ls bigfile bigfile3 bigfile-gz1.gz bigfile-xz1.xz hosts.gz bigfile2 bigfile4 bigfile-gz9.gz bigfile-xz9.xz
Tip
|
|
tar
プログラムは、アーカイブの圧縮と伸張を同時に実行することもできます。tar
は、このセクションで説明した圧縮ツールの1つを呼び出すことで、これを行います。圧縮アルゴリズムを選択するオプションを指定するだけの簡単なことです。最も一般的に使用されるのは、j
、J
、z
オプションが、それぞれ bzip2
、xz
、gzip
に対応します。以下に、それぞれのアルゴリズムを使用した例を示します:
$ cd ~/linux_essentials-3.1/compression $ ls bigfile bigfile3 bigfile-gz1.gz bigfile-xz1.xz hosts.gz bigfile2 bigfile4 bigfile-gz9.gz bigfile-xz9.xz $ tar -czf gzip.tar.gz bigfile bigfile2 bigfile3 $ tar -cjf bzip2.tar.bz2 bigfile bigfile2 bigfile3 $ tar -cJf xz.tar.xz bigfile bigfile2 bigfile3 $ ls -l | grep tar -rw-r--r-- 1 emma emma 450202 Jun 27 05:56 bzip2.tar.bz2 -rw-r--r-- 1 emma emma 548656 Jun 27 05:55 gzip.tar.gz -rw-r--r-- 1 emma emma 147068 Jun 27 05:56 xz.tar.xz
この例では、.tar
ファイルのサイズが異なることに注意しましょう。それらが正常に圧縮されたことを示しています。圧縮された .tar
アーカイブを作成する場合、使用したアルゴリズムを示す2番目のサフィックスを追加するのが普通です。それぞれが xz
、bzip2
、gzip
を示す、.xz
、.bz
、.gz
です。.tgz
などの短縮されたサフィックスが使用されることもあります。
u
オプションを使用すると、既存の圧縮されていないtarアーカイブにファイルを追加することができます。圧縮されたアーカイブに追加しようとすると、エラーになります。
$ cd ~/linux_essentials-3.1/compression $ ls bigfile bigfile3 bigfile-gz1.gz bigfile-xz1.xz bzip2.tar.bz2 hosts.gz bigfile2 bigfile4 bigfile-gz9.gz bigfile-xz9.xz gzip.tar.gz xz.tar.xz $ tar cf plain.tar bigfile bigfile2 bigfile3 $ tar tf plain.tar bigfile bigfile2 bigfile3 $ tar uf plain.tar bigfile4 $ tar tf plain.tar bigfile bigfile2 bigfile3 bigfile4 $ tar uzf gzip.tar.gz bigfile4 tar: Cannot update compressed archives(訳: 圧縮されたアーカイブを更新することはできません) Try 'tar --help' or 'tar --usage' for more information.
ZIPファイルの操作
デフォルトのWindowsマシンには、Linuxシステムでは一般的なtarボールを処理するアプリケーションや圧縮ツールがありません。 Windowsシステムとやりとりする場合には、ZIPファイルを使用します。 ZIPファイルは、圧縮された tar
ファイルと同様のアーカイブファイルです。
LinuxシステムでZIPファイルを扱うには、zip
と unzip
プログラムを使います。 以下の例では、これらの基本的な使い方を説明します。 まず、一連のファイルを作成します。
$ cd ~/linux_essentials-3.1 $ mkdir zip $ cd zip/ $ mkdir dir $ touch dir/file1 dir/file2
では、ZIPファイルにこれらのファイルを収納しましょう:
$ zip -r zipfile.zip dir adding: dir/ (stored 0%) adding: dir/file1 (stored 0%) adding: dir/file2 (stored 0%) $ rm -rf dir
続いて、ZIPファイルをほどきます:
$ ls zipfile.zip $ unzip zipfile.zip Archive: zipfile.zip creating: dir/ extracting: dir/file1 extracting: dir/file2 $ find . ./zipfile.zip ./dir ./dir/file1 ./dir/file2
ZIPファイルにディレクトリを追加する場合、-r
オプションを指定すると、zip
はディレクトリの内容も含めて格納します。-r
を指定しないと、空のディレクトリのみがZIPファイルに収められます。
演習
-
サフィックスから判断して、ファイルを作成するのに使用したツールはどれですか?
ファイル名 tar
gzip
bzip2
xz
archive.tar
archive.tgz
archive.tar.xz
-
サフィックスから判断して、アーカイブされているか、圧縮されているかを示しましょう。
ファイル名 アーカイブ 圧縮 file.tar
file.tar.bz2
file.zip
file.xz
-
gzip
で圧縮されたtar
ファイルに、1つのファイルを追加するにはどうしますか? -
tar
に絶対パスの先頭の/
を含めるように指示するオプションは何ですか? -
zip
は圧縮レベルをサポートしていますか?
発展演習
-
tar
でファイルを取り出すときに、ファイル一覧に対してグロブを使用することはできますか? -
伸張されたファイルが圧縮前のファイルと同じであることを確認するにはどうすればよいですか?
-
tar
アーカイブから、ファイルシステム上に既存のファイル取り出すとどうなりますか? -
tar
のz
オプションを使用せずに、ファイルarchive.tgz
を展開するにはどうしますか?
まとめ
Linuxシステムには、いくつかの圧縮およびアーカイブのツールが用意されています。このレッスンでは、最も一般的なものを取り上げました。最も一般的なアーカイブツールは tar
です。Windowsシステムとのやりとりが必要な場合は、zip
および unzip
を使ってZIPファイルを作成および展開できます。
tar
コマンドには、覚えておくべきオプションがいくつかあります。抽出(展開)の x
、作成の c
、内容を見る場合の t
、ファイルを追加または置換する場合の u
です。v
オプションは、アーカイブの作成または展開時に、tar
が処理しているファイルを表示します。
ほとんどのLinux ディストリビューションのリポジトリには、多くの圧縮ツールがあります。最も一般的なものは、gzip
、bzip2
、xz
です。圧縮アルゴリズムによっては、速度やファイルサイズを最適化するための圧縮レベルを指定できます。圧縮されたファイルは、それぞれ gunzip
、bunzip2
、unxz
で伸張できます。
圧縮ツールには、圧縮ファイルごとに異なりますが、多くのテキストファイルツールと同様に動作するプログラムが含まれています。zcat
、bzcat
、xzcat
などです。これらの圧縮ツールは通常、 grep
、more
、less
、diff
、cmp
などと同様に使用できます。
演習で使用したコマンド:
bunzip2
-
bzip2
で圧縮されたファイルを伸張します。 bzcat
-
bzip
で圧縮されたファイルの内容を出力します。 bzip2
-
bzip2
アルゴリズムとフォーマットで、ファイルを圧縮します。 gunzip
-
gzip
で圧縮されたファイルを伸張します。 gzip
-
gzip
アルゴリズムとフォーマットで、ファイルを圧縮します。 tar
-
tar
アーカイブを作成、更新、内容一覧、展開します。 unxz
-
xz
で圧縮されたファイルを伸張します。 unzip
-
ZIPファイルから内容を伸張して取り出します。
xz
-
xz
アルゴリズムとフォーマットで、ファイルを圧縮します。 zcat
-
gzip
で圧縮されたファイルの内容を出力します。 zip
-
ZIPアーカイブを作成、圧縮します。
演習の解答
-
サフィックスから判断して、ファイルを作成するのに使用したツールはどれですか?
ファイル名 tar
gzip
bzip2
xz
archive.tar
○
archive.tgz
○
○
archive.tar.xz
○
○
-
サフィックスから判断して、アーカイブされているか、圧縮されているかを示しましょう。
ファイル名 アーカイブ 圧縮 file.tar
○
file.tar.bz2
○
○
file.zip
○
○
file.xz
○
-
gzip
で圧縮されたtar
ファイルに、1つのファイルを追加するにはどうしますか?gunzip
でファイルを伸張し、tar uf
でファイルを追加し、gzip
でそれを再度圧縮します。 -
tar
に絶対パスの先頭の/
を含めるように指示するオプションは何ですか?-P
オプションです。マニュアルに以下のように書かれています:-P, --absolute-names Don't strip leading slashes from file names when creating archives (訳: アーカイブ作成時にファイル名から先頭のスラッシュを取り除きません)
-
zip
は圧縮レベルをサポートしていますか?サポートしています。
-#
の#
を0から9の数字で置き換えます。マニュアルに次のように書かれています:-# (-0, -1, -2, -3, -4, -5, -6, -7, -8, -9) # に数字を指定することで、圧縮の速度を調整します。 -0は、圧縮しない(ファイルがそのまま格納される)ことを、 -1は最も高速で少ない圧縮を、-9は最も低速で多くの圧縮を、 それぞれ意味します。デフォルトの圧縮レベルは6です。 すべての圧縮方法について圧縮速度を制御することを意図して いますが、作業中です。現在は、引き下げのみが機能します。
発展演習の解答
-
tar
でファイルを取り出すときに、ファイル一覧に対してグロブを使用することはできますか?--wildcards
オプションでできます。オプション指定にハイフンを使わない形式の場合、--wildcards
をtar
ファイルの次に指定する必要があります。例を示します:$ tar xf tarfile.tar --wildcards dir/file* $ tar --wildcards -xf tarfile.tar dir/file*
-
伸張されたファイルが圧縮前のファイルと同じであることを確認するにはどうすればよいですか?
このレッスンで取り上げたツールを使って何かをする必要はありません。取り上げた3つのツールは、ファイルの中にチェックサムを埋め込んでいて、伸張時に確認されます。
-
tar
アーカイブから、ファイルシステム上に既存のファイル取り出すとどうなりますか?ファイルシステム上にあるファイルが、
tar
ファイルにあるものによって上書きされます。 -
tar
のz
オプションを使用せずに、ファイルarchive.tgz
を展開するにはどうしますか?まず、
gunzip
で伸張します。$ gunzip archive.tgz $ tar xf archive.tar