【Linux】tarコマンドでアーカイブの作成・圧縮・展開を行う

目次

概要

複数のファイルやディレクトリを1つのファイル(アーカイブ)にまとめたり、そこから元のファイルを取り出したりするためのコマンドです。

「Tape ARchive」に由来しますが、現在はテープだけでなくバックアップファイルの作成や、ソースコードの配布形式(tarball)としてLinux環境で最も標準的に利用されています。

gzip や bzip2 などの圧縮形式と組み合わせて、ファイルを圧縮・解凍する際にも使用されます。

仕様(引数・オプション)

構文

tar [動作モード] [オプション] アーカイブファイル名 [対象ファイル...]

動作モード(ファンクション)

必ずいずれか1つを指定する必要があります。

モード説明
-c新しいアーカイブを作成します(create)。
-xアーカイブからファイルを展開(抽出)します(extract)。
-tアーカイブ内のファイル一覧を表示します(list)。
-r既存のアーカイブ(非圧縮)の末尾にファイルを追加します(append)。
-uアーカイブ内の同名ファイルより新しい場合のみ追加します(update)。
-A別のtarファイルを結合して1つにまとめます(cAtenate)。
-dアーカイブとファイルシステムの差分を比較します(diff)。
--deleteアーカイブから指定したファイルを削除します(非圧縮のみ)。

主なオプション

オプション説明
-f <ファイル>アーカイブファイル名を指定します(file)。必須オプションです。
-v処理中のファイル名を表示します(verbose)。
-zgzip 形式(.tar.gz)で圧縮・展開します。
-jbzip2 形式(.tar.bz2)で圧縮・展開します。
-Jxz 形式(.tar.xz)で圧縮・展開します。
-C <ディレクトリ>指定したディレクトリに移動してから処理を実行します(展開先の指定など)。
-pファイルのパーミッション(権限)を保持したまま展開します。
--exclude=<パターン>指定したパターンに一致するファイルを除外します。
--remove-filesアーカイブ作成後に元のファイルを削除します。
-T <ファイル>アーカイブ対象のリストをファイルから読み込みます。
--null-T で読み込むリストがヌル文字区切りであることを指定します。
-O展開したファイルを標準出力へ書き出します(Output)。
-hシンボリックリンクの実体をアーカイブします(dereference)。
--backup上書き時に既存ファイルのバックアップを作成します。
--suffix=<文字>バックアップファイルの末尾に付ける文字列を指定します。

基本の使い方

ディレクトリ全体を「gzip圧縮されたアーカイブファイル」にする最も一般的な例です。

オプションの z (gzip), c (作成), v (詳細表示), f (ファイル指定) を組み合わせます。

コマンド

# logsディレクトリを logs_backup.tar.gz にまとめる
tar -czvf logs_backup.tar.gz logs/

実行結果

logs/
logs/access.log
logs/error.log

実践コマンド

アーカイブを圧縮して作成する(gzip, bzip2, xz)

用途に応じて圧縮率と処理速度の異なる形式を使い分けます。

# gzip形式(一般的・高速)
tar -czvf archive.tar.gz ./target_dir

# bzip2形式(高圧縮・少し遅い)
tar -cjvf archive.tar.bz2 ./target_dir

# xz形式(最高圧縮・遅い)
tar -cJvf archive.tar.xz ./target_dir

# 確認(ファイルサイズ比較)
ls -l archive.tar.*

圧縮されたアーカイブを展開する

解凍(展開)時は -x を使います。最近のtarコマンドは、-z-j を指定しなくても拡張子から自動的に形式を判別してくれます。

# アーカイブを展開
tar -xvf archive.tar.gz

標準入出力を利用する

パイプライン処理でアーカイブを作成したり展開したりします。-f - を指定すると標準入出力を扱います。

# ファイルリストをtarにまとめて、標準出力へ流す(リダイレクトで保存)
tar -cvf - file1.txt file2.txt > manual_archive.tar

# 標準入力から受け取ったtarデータの中身を確認する
cat manual_archive.tar | tar -tvf -

アーカイブにファイルを追加・結合する(非圧縮のみ)

圧縮されていない .tar ファイルであれば、後からファイルを追加したり、別のアーカイブと結合したりできます。

# 既存の archive.tar に new_file.txt を追加
tar -rvf archive.tar new_file.txt

# archive1.tar に archive2.tar の中身を結合
tar -Avf archive1.tar archive2.tar

アーカイブからファイルを削除する(非圧縮のみ)

特定のファイルだけをアーカイブ内から消去します。これも圧縮ファイルには使えません。

# archive.tar から old_config.conf を削除
tar --delete -f archive.tar old_config.conf

既存アーカイブがある場合にバックアップを残す

同じ名前のアーカイブを作成する際、古いファイルを上書きせずに .bak などの接尾辞をつけて退避させます。

# バックアップのサフィックスを定義(環境変数でも可)
export SIMPLE_BACKUP_SUFFIX=".old"

# --backup オプションを付けて実行
tar -cJvf --backup archive.tar.xz ./src/

# 確認(archive.tar.xz.old が生成される)
ls -l archive.tar.xz*

カスタムポイント

  • オプションの順序: -f オプションは「その直後にファイル名が来る」必要があるため、-cvzf archive.tar.gz ではなく -czvf archive.tar.gz のように、fを最後に記述するのが定石です。
  • 展開先の指定: -C /tmp のように指定すると、カレントディレクトリではなく指定したディレクトリにファイルを展開できます。

注意点

  1. 圧縮ファイルへの追記不可:-r (追加) や –delete (削除) は、gzipなどで圧縮されたファイル(.tar.gzなど)に対しては実行できません。一度展開してから再作成する必要があります。
  2. 絶対パスでの作成:/home/user/data のように絶対パスで指定すると、tarは安全のために先頭の / を削除して相対パスとして保存します(tar: Removing leading ‘/’ from member names というメッセージが出ます)。展開時に意図しない場所にファイルが上書きされるのを防ぐためです。
  3. 上書き注意:展開(-x)を実行すると、カレントディレクトリに同名のファイルがある場合、警告なしで上書きされます。重要なファイルがある場所での展開は避けてください。

応用

findコマンドの結果を安全にアーカイブする

find で検索した大量のファイルをアーカイブする場合、ファイル名にスペースが含まれているとエラーになることがあります。xargs を使う場合は注意が必要ですが、モダンな tar では -T オプションとヌル文字区切りを使う方法が推奨されます。

# .logファイルを検索し、ヌル文字区切りで tar に渡してアーカイブ
# --null: 入力をヌル文字区切りとして扱う
# -T -  : ファイルリストを標準入力(-)から読み込む
find ./var/log -name "*.log" -print0 | tar -czvf logs_collection.tar.gz --null -T -

まとめ

tarコマンドは、Linuxにおけるファイル管理の基本中の基本です。単なるバックアップだけでなく、サーバー間のデータ転送や、ソースコードのパッケージングなど、あらゆる場面で利用されます。「cで作る、xで解く、tで見る」という基本動作に加え、z/j/Jによる圧縮形式の違いを理解しておけば、日常業務のほとんどをカバーできます。特に find と組み合わせたバックアップスクリプトは非常に実用的ですので、ぜひ習得してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次