LPIC Level1 復習ラジオ 13:圧縮・アーカイブ
音声
目次
アーカイブと圧縮の違い
アーカイブと圧縮は、似ていますが目的が異なります。
| 処理 | 目的 | 代表的なコマンド |
|---|---|---|
| アーカイブ | 複数のファイルやディレクトリを一つにまとめる | tar |
| 圧縮 | データの表現を変えて容量を小さくする | gzip、bzip2、xz |
| 格納と圧縮 | 複数ファイルを一つの形式へ格納しながら圧縮する | zip |
tarは、本来は複数のファイルを一つのアーカイブへまとめるコマンドです。tar単体で作成した.tarファイルは、通常は圧縮されていません。
tar -cf backup.tar documents/
この例は、documentsディレクトリをbackup.tarへまとめています。
gzip、bzip2、xzは、基本的には一つのデータストリームを圧縮します。複数ファイルをまとめて圧縮するときは、先にtarで一つにまとめます。
tar -cf backup.tar documents/
gzip backup.tar
結果は、backup.tar.gzです。
拡張子とコマンドの対応
| 代表的な拡張子 | 内容 | 主なコマンド |
|---|---|---|
.tar |
tarアーカイブ。通常は未圧縮 | tar |
.gz |
gzipで圧縮されたデータ | gzip、gunzip、zcat |
.tar.gz、.tgz |
gzip圧縮されたtarアーカイブ | tar -z |
.bz2 |
bzip2で圧縮されたデータ | bzip2、bunzip2、bzcat |
.tar.bz2、.tbz2 |
bzip2圧縮されたtarアーカイブ | tar -j |
.xz |
xzで圧縮されたデータ | xz、unxz、xzcat |
.tar.xz、.txz |
xz圧縮されたtarアーカイブ | tar -J |
.zip |
複数ファイルを格納できるZIPアーカイブ | zip、unzip |
拡張子は内容を推測する手掛かりですが、名前だけで形式が保証されるわけではありません。形式を確認する場合はfileコマンドも利用します。
file backup.tar.gz
file archive.zip
tarの基本
tarは、ファイルやディレクトリを一つのアーカイブへまとめたり、アーカイブから取り出したりするコマンドです。
tar [オプション] [アーカイブ名] [対象...]
基本操作
| オプション | 長い形式 | 意味 |
|---|---|---|
-c | --create | 新しいアーカイブを作成する |
-x | --extract | アーカイブからファイルを展開する |
-t | --list | アーカイブの内容を一覧表示する |
-f | --file | 使用するアーカイブファイル名を指定する |
-v | --verbose | 処理するファイル名を詳しく表示する |
アーカイブを作成する
tar -cf backup.tar documents/
tar -cvf backup.tar documents/
-cは作成、-fはアーカイブ名の指定です。-vを加えると、処理中のファイル名が表示されます。
内容を一覧表示する
tar -tf backup.tar
tar -tvf backup.tar
-tは、展開せずにアーカイブ内のファイル名を確認します。
展開する
tar -xf backup.tar
tar -xvf backup.tar
標準では、現在のディレクトリを基準として展開します。
指定したディレクトリへ展開する
mkdir restore
tar -xf backup.tar -C restore/
-Cは、処理を行うディレクトリを変更します。展開先のディレクトリは、事前に作成しておきます。
特定のファイルだけを展開する
tar -xf backup.tar documents/report.txt
アーカイブ内のパスを指定すると、必要な項目だけを取り出せます。先にtar -tfで正確な名前を確認します。
-fの直後に注意する
tar -cvf backup.tar documents/
-fは、次の引数をアーカイブ名として受け取ります。そのため、古い形式のようにオプションをまとめて書く場合、通常はfを最後に置き、その直後へアーカイブ名を書きます。
tarで圧縮形式を扱う
GNU tarは、圧縮プログラムと連携して、アーカイブの作成と圧縮、展開と伸長を一度に実行できます。
| オプション | 圧縮形式 | 代表的な拡張子 |
|---|---|---|
-z | gzip | .tar.gz、.tgz |
-j | bzip2 | .tar.bz2、.tbz2 |
-J | xz | .tar.xz、.txz |
gzip形式
tar -czf backup.tar.gz documents/
tar -tzf backup.tar.gz
tar -xzf backup.tar.gz
bzip2形式
tar -cjf backup.tar.bz2 documents/
tar -tjf backup.tar.bz2
tar -xjf backup.tar.bz2
xz形式
tar -cJf backup.tar.xz documents/
tar -tJf backup.tar.xz
tar -xJf backup.tar.xz
大文字の-Jがxzです。小文字の-jはbzip2なので、大小を区別します。
拡張子から形式を推測させる
tar -caf backup.tar.gz documents/
tar -xaf backup.tar.gz
GNU tarの-a、--auto-compressは、作成時にアーカイブ名の拡張子から圧縮形式を選びます。展開時には、GNU tarが形式を自動判定できる場合もありますが、LPICの基本では-z、-j、-Jの対応を覚えます。
除外するファイルを指定する
tar -czf backup.tar.gz documents/ --exclude='*.log'
tar -czf backup.tar.gz documents/ --exclude='documents/cache'
--excludeは、指定した名前やパターンに一致する項目をアーカイブから除外します。シェルによる展開を避けるため、パターンは引用符で囲むのが基本です。
gzip
gzipは、ファイルをgzip形式で圧縮します。標準の動作では、元のファイルを圧縮済みファイルへ置き換えます。
gzip file.txt
実行後は、通常file.txtがなくなり、file.txt.gzが作成されます。
展開する
gzip -d file.txt.gz
gunzip file.txt.gz
gunzipは、gzip -dと同じ目的で使えます。
元ファイルを残す
gzip -k file.txt
gzip --keep file.txt
-kは、圧縮や展開を行った後も入力ファイルを残します。
標準出力へ書き出す
gzip -c file.txt > file.txt.gz
gzip -dc file.txt.gz > restored.txt
zcat file.txt.gz
-cは標準出力へ書き出すため、元ファイルを変更せずにリダイレクトやパイプへ渡せます。zcatは、gzip圧縮された内容を展開して標準出力へ表示します。
圧縮レベル
gzip -1 file.txt
gzip -9 file.txt
-1:速度を優先する-9:圧縮率を優先する-6:一般的な標準レベル
高い圧縮レベルほど必ず実用上最適とは限りません。処理時間と圧縮後の容量のバランスで選びます。
情報表示と検査
gzip -l file.txt.gz
gzip -t file.txt.gz
-lは圧縮ファイルの情報を表示し、-tは圧縮データの整合性を検査します。
bzip2
bzip2は、ファイルをbzip2形式で圧縮します。基本的な操作体系はgzipに似ています。
bzip2 file.txt
標準の動作では、file.txtをfile.txt.bz2へ置き換えます。
展開する
bzip2 -d file.txt.bz2
bunzip2 file.txt.bz2
bunzip2は、bzip2形式の展開に使用します。
元ファイルを残す
bzip2 -k file.txt
bzip2 -dk file.txt.bz2
-kは、入力ファイルを残します。
標準出力へ表示する
bzip2 -c file.txt > file.txt.bz2
bzip2 -dc file.txt.bz2 > restored.txt
bzcat file.txt.bz2
bzcatは、bzip2圧縮された内容を展開して標準出力へ表示します。
圧縮レベルと検査
bzip2 -1 file.txt
bzip2 -9 file.txt
bzip2 -t file.txt.bz2
-1から-9はブロックサイズを指定し、一般に大きい値ほど多くのメモリを使用します。-tは、展開結果を書き出さずに圧縮ファイルの整合性を確認します。
xz
xzは、ファイルをxz形式で圧縮します。コマンド体系はgzipやbzip2に似ています。
xz file.txt
標準の動作では、file.txtをfile.txt.xzへ置き換えます。
展開する
xz -d file.txt.xz
unxz file.txt.xz
unxzは、xz -dとして動作します。
元ファイルを残す
xz -k file.txt
xz -dk file.txt.xz
標準出力へ表示する
xz -c file.txt > file.txt.xz
xz -dc file.txt.xz > restored.txt
xzcat file.txt.xz
xzcatは、xz圧縮された内容を展開して標準出力へ表示します。
圧縮レベルとスレッド
xz -0 file.txt
xz -9 file.txt
xz -T0 largefile
-0:高速でメモリ使用量が少ない設定-9:圧縮率を重視する設定-T0:利用可能なプロセッサースレッド数を自動的に選ぶ
高い設定では、圧縮時だけでなく展開時にも多くのメモリを必要とする場合があります。
情報表示と検査
xz -l file.txt.xz
xz -t file.txt.xz
-lは圧縮ファイルの情報を表示し、-tは整合性を検査します。
zipとunzip
zipは、一つまたは複数のファイルをZIPアーカイブへ格納し、通常は圧縮します。tarと単一ファイル圧縮コマンドを組み合わせたような役割を一つの形式で持ちます。
ZIPファイルを作成する
zip archive.zip file1.txt file2.txt
ディレクトリを再帰的に格納する
zip -r archive.zip documents/
-rは、ディレクトリの内部を再帰的に処理します。ディレクトリをZIPへ格納するときの基本オプションです。
内容を一覧表示する
unzip -l archive.zip
zipinfo archive.zip
unzip -lは、展開せずにZIP内のファイルを一覧表示します。
展開する
unzip archive.zip
unzip archive.zip -d restore/
-dは展開先ディレクトリを指定します。
既存ファイルの扱い
unzip -n archive.zip
unzip -o archive.zip
-n:既存ファイルを上書きしない-o:確認せず既存ファイルを上書きする
-oは便利ですが、誤って必要なファイルを上書きしないように注意します。
ZIPファイルを検査する
unzip -t archive.zip
-tは、ファイルを通常の場所へ展開せず、ZIPアーカイブの内容を検査します。
除外パターンを指定する
zip -r archive.zip documents/ -x '*.log'
-xは、指定パターンに一致する項目を除外します。シェルに先に展開されないよう、パターンを引用符で囲みます。
一覧表示・検査・標準出力
圧縮ファイルを扱うときは、いきなり展開するだけでなく、内容の確認、整合性の検査、標準出力への展開を使い分けます。
| 形式 | 一覧・情報 | 整合性検査 | 展開して標準出力 |
|---|---|---|---|
| tar | tar -tf archive.tar |
形式に応じた圧縮コマンドや展開テスト | tar -xOf archive.tar path |
| gzip | gzip -l file.gz |
gzip -t file.gz |
zcat file.gz |
| bzip2 | 専用の簡易一覧機能は限定的 | bzip2 -t file.bz2 |
bzcat file.bz2 |
| xz | xz -l file.xz |
xz -t file.xz |
xzcat file.xz |
| ZIP | unzip -l archive.zip |
unzip -t archive.zip |
unzip -p archive.zip path |
圧縮されたテキストを検索する
zcat access.log.gz | grep 'ERROR'
bzcat access.log.bz2 | grep 'ERROR'
xzcat access.log.xz | grep 'ERROR'
展開結果を標準出力へ流せば、一時ファイルを作らずにgrepなどへ渡せます。
tar内の一ファイルを標準出力へ取り出す
tar -xOf backup.tar documents/report.txt
tar -xzOf backup.tar.gz documents/report.txt
-Oは、取り出したファイルを通常のファイルとして書き出さず、標準出力へ送ります。大文字のオーです。
パイプでtarアーカイブを圧縮する
tar -cf - documents/ | gzip > backup.tar.gz
gzip -dc backup.tar.gz | tar -xf -
-f -のハイフンは、アーカイブを標準入力または標準出力で扱う指定です。通常はtar -czfやtar -xzfの方が簡潔ですが、パイプの理解に役立ちます。
安全な展開とよくある間違い
展開前に内容を確認する
tar -tf downloaded.tar.gz
unzip -l downloaded.zip
入手元を信頼できないアーカイブは、最初に内容を一覧表示し、想定外の絶対パスや親ディレクトリを示すパス、既存ファイルと衝突する名前がないかを確認します。
空の作業用ディレクトリへ展開する
mkdir extracted
tar -xf downloaded.tar -C extracted/
unzip downloaded.zip -d extracted/
現在の作業ディレクトリへ直接展開すると、多数のファイルが散らばったり、同名ファイルと衝突したりする場合があります。専用ディレクトリへ展開すると確認しやすくなります。
| 間違いやすい点 | 確認すること |
|---|---|
tar自体が必ず圧縮すると考える |
.tarは通常未圧縮。圧縮形式には-z、-j、-Jを使う |
-jと-Jを混同する |
小文字の-jはbzip2、大文字の-Jはxz |
tar -cvf directory backup.tarと書く |
-fの直後はアーカイブ名。tar -cvf backup.tar directory |
| 圧縮後も元ファイルが残ると思う | gzip、bzip2、xzは標準で入力ファイルを置換する。残すなら-kや-c |
ディレクトリをzipへ入れられない |
zip -rで再帰的に処理する |
| 内容を確認せず現在のディレクトリへ展開する | 先に一覧表示し、空の専用ディレクトリへ展開する |
| 拡張子だけで形式を断定する | fileコマンドや一覧表示、検査機能でも確認する |
-xの意味を全コマンドで同じと考える |
tar -xは展開、zip -xは除外。コマンドごとに意味を確認する |
manページとinfoを確認する
man tar
man gzip
man bzip2
man xz
man zip
man unzip
info tar
info gzip
30秒チェック
- アーカイブと圧縮は、目的がどのように違うでしょうか。
- tarアーカイブの作成、一覧表示、展開に使う基本オプションは何でしょうか。
tarの-fは何を指定するオプションでしょうか。- gzip、bzip2、xzを
tarで扱うオプションは、それぞれ何でしょうか。 gzip、bzip2、xzで元ファイルを残す代表的なオプションは何でしょうか。- gzip、bzip2、xzの内容を展開して標準出力へ表示するコマンドは何でしょうか。
- ディレクトリをZIPへ格納するときに使うオプションは何でしょうか。
- tarアーカイブとZIPアーカイブを展開前に一覧表示するコマンドを答えてください。
答えを表示
- アーカイブは複数ファイルを一つにまとめ、圧縮はデータ容量を小さくする処理
- 作成は
-c、一覧表示は-t、展開は-x - 使用するアーカイブファイル名を指定する
- gzipは
-z、bzip2は-j、xzは-J -kzcat、bzcat、xzcat-rtar -tf アーカイブ名、unzip -l ZIP名
要約
- アーカイブは複数のファイルを一つにまとめる処理、圧縮はデータ容量を小さくする処理です。
tarは本来アーカイブコマンドであり、未圧縮の.tarも作成できます。tar -cは作成、-tは一覧表示、-xは展開、-fはアーカイブ名の指定です。tar -zはgzip、-jはbzip2、-Jはxzと連携します。gzip、bzip2、xzは、標準では入力ファイルを圧縮済みファイルへ置き換えます。- 元ファイルを残すには
-k、標準出力へ書き出すには-cを使います。 gunzip、bunzip2、unxzは、それぞれの形式を展開します。zcat、bzcat、xzcatは、展開した内容を標準出力へ送ります。zip -rはディレクトリを再帰的にZIPへ格納し、unzipで展開します。- 入手元を信頼できないアーカイブは、先に内容を一覧表示し、空の専用ディレクトリへ展開します。
参考資料
- GNU tar Manual
- GNU tar:Basic GNU tar Operations
- GNU tar:How to Create Archives
- GNU tar:How to Extract Members from an Archive
- GNU Gzip Manual
- bzip2 and libbzip2 Manual
- XZ Utils:xz(1)
- Info-ZIP:Zip 3.0
- tar(1) manual page
- gzip(1) manual page
- bzip2(1) manual page
- xz(1) manual page
- zip(1) manual page
- unzip(1) manual page