Linux で複数のファイルやディレクトリを1つにまとめたり、まとめたものを圧縮してサイズを小さくしたりするときに使うのが tar コマンドです。サーバーへのファイル転送、バックアップの作成、配布された .tar.gz ファイル(いわゆる「tarball」)の展開など、開発の現場では避けて通れない基本ツールです。この記事では、tar でアーカイブを作る・中身を確認する・展開するという一連の操作を、gzip による圧縮も含めて実例つきで解説します。オプションの意味が分かりにくいという方でも、迷わず使えるようになることを目指します。
目次
そもそも tar は何をするコマンドか
tar は「tape archive(テープアーカイブ)」に由来する名前で、もともとは複数のファイルをテープ装置へ順番に書き出すためのツールでした。今では、複数のファイルやディレクトリを1つのファイル(アーカイブ)にまとめる役割で使われます。ここで大切なのは、tar 単体が行うのは「まとめる」ことだけで、圧縮そのものは行わないという点です。ファイルをまとめた .tar ファイルは、元のファイルサイズの合計とほぼ同じ大きさになります。
そこで、まとめると同時にサイズを小さくしたいときは、gzip という圧縮方式を組み合わせます。tar には gzip を呼び出すオプションが用意されているため、コマンド1つで「まとめて圧縮する」「展開して取り出す」ところまで一気に行えます。こうして作られたのが、よく見かける .tar.gz や .tgz というファイルです。ZIP に近い感覚で扱えると考えるとイメージしやすいでしょう。
まず覚えたい主要オプション
tar は覚えるオプションこそ多いものの、実際に日常で使うのはごく一部です。次の表のオプションを組み合わせるだけで、作成・確認・展開のほとんどをまかなえます。-c -x -t のいずれか(何をするか)に、-z -v -f(どう処理するか)を足していく、という考え方で捉えると整理しやすくなります。
| オプション | 意味 |
|---|---|
-c | アーカイブを新しく作成する(create) |
-x | アーカイブを展開する(extract) |
-t | アーカイブの中身を一覧表示する(list) |
-f | 対象のアーカイブファイル名を指定する(file) |
-z | gzip 形式で圧縮・展開する |
-j | bzip2 形式で圧縮・展開する |
-v | 処理中のファイル名を表示する(verbose) |
-C | 展開先(作成時は基準)のディレクトリを指定する |
とくに -f は「このあとに続くのがアーカイブのファイル名です」と伝えるオプションで、ほぼ必ず付けます。そして -f の直後にファイル名を書くのが約束事です。オプションはまとめて -czf のように書けますが、その場合も f を最後に置き、続けてファイル名を書きます。
ファイルをまとめて圧縮する(作成)
gzip で圧縮しながらアーカイブを作る基本形は tar -czf 作成するファイル名 まとめる対象 です。-c で作成、-z で gzip 圧縮、-f で出力ファイル名を指定しています。慣例として圧縮したアーカイブには .tar.gz という拡張子を付けます。
# 書式: tar -czf 出力ファイル まとめる対象
# project ディレクトリを gzip 圧縮して project.tar.gz にまとめる
tar -czf project.tar.gz project/
# 複数のファイルをまとめて圧縮することもできる
tar -czf backup.tar.gz index.html style.css script.js
処理中にどのファイルが対象になっているかを確認したいときは、-v を足します。ファイル数が多いバックアップでは、進行状況が見えて安心です。オプションをまとめて -czvf と書ける点にも注目してください。
# -v を足すと処理したファイル名が1つずつ表示される
tar -czvf project.tar.gz project/
なお gzip ではなく、より圧縮率の高い bzip2 を使いたい場合は -z の代わりに -j を指定します。この場合は拡張子を .tar.bz2 にするのが一般的です。圧縮率が上がる代わりに処理時間は長くなるため、通常のバックアップやウェブ配布では gzip(-z)で十分なことがほとんどです。
展開する前に中身を確認する
受け取った .tar.gz をいきなり展開すると、カレントディレクトリに大量のファイルが散らばってしまうことがあります。そうした事故を避けるため、展開する前に中身を一覧で確認する習慣をつけると安全です。中身の確認には -t(list)を使い、gzip 圧縮されているので -z も添えて tar -tzf ファイル名 とします。
# アーカイブを展開せずに、含まれるファイルの一覧だけ表示する
tar -tzf project.tar.gz
一覧の先頭が project/ のようにディレクトリでまとまっていれば、展開してもそのディレクトリの中に収まるため安心です。逆に index.html style.css のようにファイルが直接並んでいる場合は、展開するとカレントディレクトリに直接ばらまかれます。後述する -C で展開先を指定するなどの対策を検討しましょう。
アーカイブを展開する
展開(取り出し)には -x(extract)を使います。gzip 圧縮された .tar.gz を展開する基本形は tar -xzf ファイル名 です。実行すると、アーカイブに含まれていたファイルやディレクトリが、その構造のままカレントディレクトリに取り出されます。
# .tar.gz を展開する(-x 展開 / -z gzip / -f ファイル指定)
tar -xzf project.tar.gz
# 展開したファイル名も確認したいときは -v を足す
tar -xzvf project.tar.gz
展開先のディレクトリを指定する -C
展開先を明示したいときは -C に続けてディレクトリを指定します。カレントディレクトリを汚さずに済み、中身が直下にファイルを並べているアーカイブでも安全に扱えます。指定するディレクトリはあらかじめ作成しておく必要があります。存在しないディレクトリを指定するとエラーになるため、先に mkdir で用意しておきましょう。
# 展開先の dist ディレクトリを先に用意しておく
mkdir dist
# dist の中へ展開する(-C のあとに展開先ディレクトリ)
tar -xzf project.tar.gz -C dist
特定のファイルを除いてまとめる –exclude
ディレクトリごとアーカイブを作るとき、node_modules やログファイルなど、含めたくないものが混ざっていることがあります。そうした対象を除外するには --exclude オプションでパターンを指定します。除外したいものが複数あるときは --exclude を複数回並べて書けます。
# node_modules と .git を除いて project をまとめる
tar -czf project.tar.gz --exclude=node_modules --exclude=.git project/
# ワイルドカードで .log ファイルをすべて除外する
tar -czf logs-backup.tar.gz --exclude='*.log' logs/
--exclude は -czf などのオプションより前に書くのが確実です。除外指定はアーカイブに含めるファイルを走査するより先に評価される必要があるためで、対象ディレクトリの指定より前に置いておけば意図どおりに除外されます。
「tar: Cannot open」などのエラーが出るとき
ファイル名の位置が間違っている
もっとも多いのが -f の直後にファイル名を置いていないケースです。たとえば tar -cfz project.tar.gz project/ のように f のあとに z を書いてしまうと、tar は z という名前のアーカイブを作ろうとして混乱します。オプションをまとめて書くときは、f を最後に置き、その直後にファイル名を続ける、と覚えておくと間違えません。正しくは tar -czf project.tar.gz project/ です。
gzip 指定を付け忘れている
.tar.gz を展開しようとして tar: This does not look like a tar archive のようなエラーが出る場合、-z を付け忘れている可能性があります。圧縮されたアーカイブは、展開時にも -z(gzip)や -j(bzip2)で圧縮方式を伝える必要があります。なお、GNU tar など多くの環境では圧縮形式を自動判別してくれるため、-z を省いて tar -xf project.tar.gz としても展開できることが多いですが、確実を期すなら明示するのがおすすめです。
先頭の / に関する警告が出る
絶対パスを指定してアーカイブを作ると tar: Removing leading `/' from member names という警告が表示されることがあります。これはエラーではなく、展開時に思わぬ場所へファイルが書き込まれるのを防ぐため、先頭の / を取り除いて相対パスとして保存したという通知です。基本的にはそのまま進めて問題ありませんが、意図しないパスが含まれていないか気になるときは、前述の -t で中身を確認しておくと安心です。
まとめ
tar は、複数のファイルを1つにまとめ、必要なら gzip で圧縮まで行える基本コマンドです。要点を振り返ると、作成は tar -czf ファイル名 対象、中身の確認は tar -tzf ファイル名、展開は tar -xzf ファイル名 の3つが軸になります。展開先を変えたいときは -C、含めたくないものがあるときは --exclude を組み合わせます。-c -x -t のどれをするかを決め、そこに -z と -f ファイル名 を足す、という考え方さえ身につければ、tarball の扱いに迷うことはなくなるはずです。