UNIX/Linuxの部屋 コマンド:tar

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド tar アーカイバ。複数のファイルを1つにまとめる。 このエントリーをはてなブックマークに追加

最終更新


UNIX/Linux の tar コマンドは、複数のファイルをまとめて tar 形式というアーカイブファイルにまとめる機能と、その逆の、tar 形式のアーカイブファイルを展開して元のファイルを作成する機能がある。ファイル・ディレクトリのバックアップを取得したり、他のサーバに複数のファイル・ディレクトリを移動する際に使用する。


tar コマンドの基本的な使い方
まずは下記 3つを覚えよう。

archive.tar の中身の一覧を見るときは:
% tar tvf archive.tar
archive.tar を展開するときは:
% tar xvf archive.tar
ディレクトリ dir/ 以下のファイルを archive.tar にまとめるには:
% tar cvf archive.tar dir/

上記のようにアーカイブファイルの拡張子は .tar とするのが一般的である。

tar コマンドと gzip や bzip2 との関係
tar コマンドはアーカイブをまとめたり展開する機能はあるが、圧縮・展開 (解凍) の機能はない。また、gzip・bzip2 等のコマンドは圧縮・展開 (解凍) することができるが、複数ファイルを 1つにまとめる機能はない。

よって、複数ファイルをアーカイブしつつ圧縮も同時に行う場合、tar と gzip・bzip2 を連携させることになる。

tar で生成したアーカイブファイルを gzip で圧縮する場合、"z" オプションをつける。
% tar zcvf archive.tar.gz dir/
tar で生成したアーカイブファイルを bzip2 で圧縮する場合、"j" オプションをつける。
% tar jcvf archive.tar.bz2 dir/

なお、上記はそれぞれ
% tar cvf archive.tar dir/
% gzip archive.tar

% tar cvf archive.tar dir/
% bzip2 archive.tar
と同じである。

さらに以下のように 1行で書くこともできる。
% tar cvf - dir/ | gzip -c > archive.tar.gz
% tar cvf - dir/ | bzip2 -c > archive.tar.bz2

*BSD や Linux の GNU tar 以外の tar、具体的には Solaris や HP-UX の tar には z オプションや j オプションがないため、tar と gzip・bzip2 を個別に実行する必要がある。

なお、拡張子についての慣例は下記のとおり。ただし当ページ管理人的には ".tgz" は "tar+gzip" だとすぐにわかるが、".tbz" や ".txz" は一瞬考えてしまう。".tar.XX" 形式の方がわかりやすいのではないかと思う次第。
  • .tar … tar でアーカイブしたのみ。圧縮なし
  • .tar.gz … tar アーカイブ + gzip で圧縮
  • .tgz … tar アーカイブ + gzip で圧縮
  • .tar.bz2 … tar アーカイブ + gzip で圧縮
  • .tbz … tar アーカイブ + bzip2 で圧縮
  • .tbz2 … tar アーカイブ + bzip2 で圧縮
  • .tar.xz … tar アーカイブ + xz で圧縮
  • .txz … tar アーカイブ + xz で圧縮

tar アーカイブの中身を表示する
hoge.tar の中のファイル一覧を見るときは、
% tar tf hoge.tar
dir/
dir/file1.txt
dir/subdir/
dir/subdir/file2.txt
v オプションをつけると、パーミッション・オーナー・グループ・タイムスタンプも表示される。
% tar tvf hoge.tar
drwxr-xr-x 0 68user 68user 0 Dec 8 23:43 skeleton/
-rw-r--r-- 0 68user 68user 6840 Nov 12 18:31 dir/file1.txt
drwxr-xr-x 0 68user 68user 0 Dec 8 23:43 dir/subdir/
-rw-r--r-- 0 68user 68user 887 Sep 8 2016 dir/subdir/file2.txt
gzip で圧縮されたアーカイブ (hoge.tar.gz や hoge.tgz)、bzip2 で圧縮されたアーカイブ (hoge.tar.bz2 や hoge.tbz) のファイル一覧を見るときは、追加オプションは不要である。
% tar tvf hoge.tar.gz
hoge.tar.gz の中から、file1、file2 というファイルの情報を見るとき
% tar ztvf hoge.tar.gz file1 file2
hoge.tar.gz の中から、ファイル名が fuga で始まるファイルの情報を見るとき
% tar ztvf hoge.tar.gz file\*

tar アーカイブを展開する
hoge.tar の中身をカレントディレクトリに展開するとき
% tar xvf hoge.tar
/tmp/hoge.tar.gz の中身をカレントディレクトリに展開するとき
% tar zxvf /tmp/hoge.tar.gz
/tmp/hoge.tar.gz の中身を ~/test ディレクトリに展開するとき
% tar zxvf /tmp/hoge.tar.gz -C ~/test
% (cd ~/test; tar zxvf /tmp/hoge.tar) (どちらでも同じ結果になる)
hoge.tgz の中から、*.txt というファイルだけをカレントディレクトリに展開するとき
% tar zxvf hoge.tgz \*.txt
hoge.tar から *.txt というファイルだけを /tmp に展開するとき
% tar zxvf hoge.tar -C /tmp `tar tf hoge.tar|grep .txt`

アーカイブ作成時の注意点
カレントディレクトリ以下のファイル・ディレクトリを /tmp/hoge.tar にまとめるときは、
% tar cvf /tmp/hoge.tar .
とする。このとき、
% tar cvf hoge.tar .
のようにカレントディレクトリにアーカイブを作成しようとしてはいけない。hoge.tar がカレントディレクトリに書き出されるので、hoge.tar の中に hoge.tar 自身が含まれてしまうことがある。

また、カレントディレクトリが /home/user/dir であるとき、
% tar cf /tmp/hoge.tar /home/user/dir
などとアーカイブ対象ファイルを絶対パス (/home/user/dir) で指定しないようにしよう。

FreeBSD や Linux などの tar は
% tar tf /tmp/hoge.tar
home/user/dir/file1
home/user/dir/file2
home/user/dir/file3
home/user/dir/file4
home/user/dir/file5
...
と、絶対パス (から先頭の/を取り除いたもの) でファイル名を記録するため展開時に無駄なディレクトリが作成されるだけで済む。しかし、HP-UX の tar など、絶対パスで作成したアーカイブは、全く同じディレクトリにしか展開できない。別マシンで展開する場合などは、非常に不便である。

このような場合は、
% cd /home/user/dir ; tar cf /tmp/hoge.tar .
事前に cd してから相対ディレクトリで指定するとよい。カレントディレクトリが変わるのが嫌なら、
% ( cd /home/user/dir ; tar cf /tmp/hoge.tar . )
とサブシェルで実行すれば、シェル自身のカレントディレクトリは変化しない。

tar コマンドの命令
命令: 以下の中から必ず1つだけ指定しなければならない。
▷ c … tarファイルを新しく作る
▷ x … tarファイルを展開する
▷ t … tarファイルの内容を表示する
▷ r … tarファイルに追加する。z や Z オプションと同時には使えない。

tar コマンドのオプション
オプション:
▷ f … tarファイルを指定する
一見、毎回 f オプションを指定する意味がないように思えるが、本来 tar はテープドライブに書き出すコマンドであったので (何しろ tar の語源は Tape ARchiver である)、f でアーカイブ名を指定しないとテープドライブのデバイス /dev/rst0・/dev/st0 などを対象に読み書き
してしまう (具体的なデバイス名は OS により異なる)。
▷ p … パーミッションや owner、group の情報を保存する。
これは x での展開時にのみ影響する。
▷ v … バーボーズ (冗長) モード。処理内容を詳しく表示する
パーミッションなどの詳細な情報が表示されるため、はじめのうちはアーカイブ作成・展開時に tar cvf や tar xvf などと v オプションを付けたくなるかもしれない。しかし、慣れてきたら v オプションを指定しないようにしよう。

なぜなら、アーカイブ作成・展開時に何かのエラーが標準エラー出力に表示されるかもしれないからだ。もし v オプションを付加すると、エラー表示が v オプションによる冗長出力に埋もれて気づかない可能性がある。
▷ z … アーカイブ作成時に gzip で圧縮する。*BSD・Linux 以外の tar では使用できない可能性あり。
% tar ztf foo.tar.gz (gzip -dc foo.tar.gz | tar tf - と同じ)
▷ j … アーカイブ作成時に bzip2 で圧縮する。*BSD・Linux 以外の tar では使用できない可能性あり。
% tar jtf foo.tar.bz2 (bzip2 -dc foo.tar.gz | tar tf - と同じ)
▷ J … アーカイブ作成時に xz で圧縮する。*BSD・Linux 以外の tar では使用できない可能性あり。
▷ Z … アーカイブ作成時に compress で圧縮する。*BSD・Linux 以外の tar では使用できない可能性あり。
% tar Zxvf foo.tar.Z
⇒ compress で圧縮されている foo.tar.Z を展開する。
▷ a … アーカイブ作成時に、アーカイブファイル名の拡張子から自動的に圧縮フォーマットを決定する。FreeBSD の tar のみ使用可能 (bsdtar のみ)。
% tar acf foo.tar dir/
→ tar のまま
% tar acf foo.tar.gz dir/
→ tar + gzip で生成
% tar acf foo.tgz dir/
→ tar + gzip で生成
% tar acf foo.tar.bz2 dir/
→ tar + bzip2 で生成
% tar acf foo.tbz dir/
→ tar + bzip2 で生成
▷ O … 抽出したファイルを標準出力に出力する (x オプションと併用)
% tar xvfO hoge.tar file1.dat > file2
⇒ hoge.tar から file1.dat を取り出し、file2 というファイル名で保存
▷ C … 指定のディレクトリにファイルを展開する
普通に
% tar xvf /dir/foo.tar
とすると、カレントディレクトリにファイルが展開される。/bar/ に展開したい場合は
% tar xvf /dir/foo.tar -C /bar
とする。これは
% (cd /bar ; tar xvf /dir/foo.tar)
と同じ。


各 UNIX/Linux での tar 実装
もともと UNIX としての由緒正しい tar コマンドがあったが、それほど便利ではなく、例えば z オプションがなかったりする。

一方、GNU tar が開発され、どんどん高機能・便利な方向に進化していった。オープンソース系の FreeBSD・NetBSD・Linux などは軒並み GNU tar を採用していた。しかしながら FreeBSD は 5.4-RELASE あたりから bsdtar という独自の tar 実装を採用している。とはいえ bsdtar は GNU tar も意識しているので、「便利な tar コマンド」系である。

Solaris や HP-UX を使っている場合は、もしかしたら管理者が /opt/gnu/bin/tar や /usr/local/bin/tar にインストールしてくれている場合もあるので確認してみよう。また、GNU tar は gtar というコマンド名でインストールされていることもある。
>> Solaris10オンラインマニュアル(man) Solaris10 tar(1)
>> Linuxオンラインマニュアル(man) Linux tar(1)
>> FreeBSDオンラインマニュアル(man) FreeBSD tar(1)

読み方 tar (UNIXコマンド) [たー] [たる] [たーる] このエントリーをはてなブックマークに追加

"Tape ARchive" の略。[たる] では "樽" みたいだ。 [たーる] ではコールタールみたいだ。