tar コマンド

目次

概要

tar - 複数ファイルをアーカイブする

コマンドライン

Usage: tar [OPTION...] [FILE]...

対象バージョン

説明

概要

tar で「ター」と読みます。複数のディレクトリやファイルをひとつのファイルにアーカイブしたり、アーカイブファイルからディレクトリやファイルを抽出する機能を持ちます。tar は Tape ARchiver の略で、元々は磁気テープ媒体にバックアップするのが主な利用用途でした。

アーカイブ

-c はアーカイブファイルを新規作成することを指示するオプションです。dirA ディレクトリ配下のすべてのディレクトリやファイルを、dirA.tar というファイルにアーカイブします。-v は対象ファイルを表示、-f はアーカイブファイル名を指定するオプションです。

$ tar -cvf dirA.tar dirA

まだオプションに - をつける習慣がなかった頃に開発されたコマンドでもあることから、最初に指定する -c などの1文字オプションは - を省略することができます。

$ tar cvf dirA.tar dirA

リスト

-t はアーカイブに含まれるディレクトリやファイルの一覧を表示するオプションです。

$ tar tf dirA.tar
dirA/
dirA/fileA
dirA/fileB

-v もつけると詳細を表示します。

$ tar tvf dirA.tar
drwxr-xr-x yamada/yamada     0 2025-08-14 06:18 dirA/
-rw-r--r-- yamada/yamada     4 2025-08-14 06:18 dirA/fileA
-rw-r--r-- yamada/yamada     4 2025-08-14 06:18 dirA/fileB

抽出

-x はアーカイブファイルからディレクトリやファイルを抽出します。

$ tar xvf dirA.tar

圧縮ファイル

アーカイブファイルを gzip 形式の圧縮ファイル形式で作成・リスト・抽出する場合は -z をつけます。gzip 形式で圧縮されたアーカイブファイル名の拡張子は通常 .tar.gz.tgz とします。

$ tar zcvf dirA.tgz dirA      # アーカイブ
$ tar ztvf dirA.tgz           # リスト
$ tar zxvf dirA.tgz           # 抽出

bzip2 形式で圧縮する場合は -j オプション、xz 形式で圧縮する場合は -J オプションを用います。

$ tar jcvf dirA.tg2 dirA      # アーカイブ
$ tar jtvf dirA.tg2           # リスト
$ tar jxvf dirA.tg2           # 抽出
$
$ tar Jcvf dirA.tar.gz dirA      # アーカイブ
$ tar Jtvf dirA.tar.gz        # リスト
$ tar Jxvf dirA.tar.gz        # 抽出

オプション

重要オプション

-f, --file=ARCHIVE
アーカイブファイルを指定します。
$ tar xvf archive.tar
$ tar xv -f archive.tar
$ tar xv --file=archive.tar

磁器テープを使用していた頃の名残で、-f オプション省略時は環境変数 TAPE に指定したファイルをアーカイブファイルとします。

$ export TAPE=archive.tar
$ tar xv
-v, --verbose
処理中のファイル名を表示します。
$ tar tvf archive.tar
$ tar tf archive.tar -v
$ tar -v -tf archive.tar
$ tar --verbose -tf archive.tar

操作モード

-c, --create
新しいアーカイブを作成します。
$ tar cvf archive.tar dirA
-x, --extract, --get
アーカイブからファイルを抽出して展開します。
$ tar xvf archive.tar
-t, --list
アーカイブの中のファイル一覧を表示します。
$ tar tvf archive.tar
-r, --append
アーカイブにファイルを追加します。
$ tar rvf archive.tar fileA
--add-file=FILE
FILE をアーカイブに追加します。- で始まるファイル名の場合に使用していたようですが、現在では -- でオプションの終わりを用いた方がよさそうです。
$ tar rvf archive.tar -fileA                # オプションとみなされてエラー
$ tar rvf archive.tar --add-file=-fileA     # --add-fileを用いればOK
$ tar rvf archive.tar -- -fileA             # --でオプションの終わりを示してもOK
-A, --catenate, --concatenate
アーカイブに別のアーカイブを追加します。
$ tar cvf archive1.tar fileA fileB    # archive1.tar を作成する
$ tar cvf archive2.tar fileC fileD    # archive2.tar を作成する
$ tar Avf archive1.tar archive2.tar   # archive1.tar に archive2.tar をアペンドする
-u, --update
アーカイブ中のファイルよりも新しいファイルをアーカイブの末尾に加えます。展開すると古いファイルは新しいファイルで上書きされます。
$ tar cvf archive.tar fileA fileB        # アーカイブを作成する
$ touch fileA                            # ファイルを更新する
$ tar uvf archive.tar fileA              # 更新ファイルをアーカイブにアペンドする
$ tar tvf archive.tar
-rw-r--r-- yamada/yamada     2 2025-08-09 07:05 fileA   # 古いファイル
-rw-r--r-- yamada/yamada     2 2025-08-09 07:05 fileB
-rw-r--r-- yamada/yamada     2 2025-08-09 07:07 fileA   # 新しいファイル
-d, --diff, --compare
アーカイブ中のファイルとファイルシステム上のファイルを比較します。
$ tar dvf archive.tar          # アーカイブ中のすべてのファイルを比較
fileA:
fileA: Mod time differs
fileA: Size differs
fileB:
$ tar dvf archive.tar fileA    # fileA のみを比較
fileA:
fileA: Mod time differs
fileA: Size differs
--delete
アーカイブからファイルを削除します。.tgz などの圧縮ファイルに対しては指定できません。
$ tar cvf archive.tar fileA fileB     # archive.tar を作成する
$ tar --delete -f archive.tar fileB   # archive.tar から fileB を削除する

圧縮・展開

-z, --gzip, --gunzip, --ungzip
アーカイブファイルを gzip で圧縮・展開します。拡張子は .tar.gz, .tgz, .taz をよく使用します。
$ tar zcvf dirA.tgz dirA       # アーカイブ
$ tar tcvf dirA.tgz            # 一覧
$ tar zxvf dirA.tgz            # 展開
-j, --bzip2
アーカイブファイルを bzip2 で圧縮・展開します。拡張子は .tar.bz2, .tz2, .tbz2, .tbz をよく使用します。
$ tar jcvf dirA.tar.bz2 dirA   # アーカイブ
$ tar jtvf dirA.tar.bz2        # 一覧
$ tar jxvf dirA.tar.bz2        # 展開
-J, --xz
アーカイブファイルを xz で圧縮・展開します。拡張子は .tar.xz をよく使用します。
$ tar Jcvf dirA.tar.xz dirA    # アーカイブ
$ tar Jtvf dirA.tar.xz         # 一覧
$ tar Jxvf dirA.tar.xz         # 展開
-Z, --compress, --uncompress
アーカイブファイルを compress で圧縮・展開します。拡張子は .tar.Z, .taZ をよく使用します。
--lzip
アーカイブファイルを lzip で圧縮・展開します。拡張子は .tar.lz をよく使用します。
--lzma
アーカイブファイルを lzma で圧縮・展開します。拡張子は .tar.lzma, .tlz をよく使用します。
--lzop
アーカイブファイルを lzop で圧縮・展開します。拡張子は .tar.lzo をよく使用します。
--zstd
アーカイブファイルを zstd で圧縮・展開します。拡張子は .tar.zst, .tzst をよく使用します。
-a, --auto-compress
圧縮・展開の際、アーカイブファイルの拡張子から圧縮アルゴリズムを自動選択します。
$ tar acvf dirA.tgz dirA       # アーカイブ
$ tar atvf dirA.tgz            # 一覧
$ tar axvf dirA.tgz            # 展開
--no-auto-compress
圧縮・展開の際、アーカイブファイルの拡張子から圧縮アルゴリズムを自動選択しません。
-I, --use-compress-program=PROG
圧縮・展開に用いるコマンドを PROG で指定します。コマンドは展開を示すオプション -d をサポートしている必要があります。
$ tar cvf dirA.tgz --use-compress-program=gzip dirA
$ tar xtf dirA.tgz --use-compress-program=gzip
$ tar xvf dirA.tgz --use-compress-program=gzip

対象ファイルの除外(exclusion)

--exclude=PATTERN
PATTERN にマッチするファイルを除外します。
$ tar cvf dirA.tar --exclude="*.log" dirA
--exclude-backups
バックアップやロックファイルを除外します。具体的には .#* または *~ または #*# にマッチするファイルを除外します。
$ tar cvf dirA.tar --exclude-backups dirA
-X, --exclude-from=FILE
除外する対象を FILE から読み込みます。FILE はすべてのディレクトリに適用されます。
$ cat exclude.txt
*.log
*.bak
old
$ tar cvf dirA.tar --exclude-ignore=exclude.txt dirA
--exclude-ignore=FILE
除外する対象を各ディレクトリに配置された FILE から読み込みます。FILE はそのディレクトリのみに適用されます。(※ マニュアルにはこう説明されていますが、何故かサブディレクトリに対しても適用されるようです。)
$ cat dirA/exclude.txt
*.log
*.bak
old
$ tar cvf dirA.tar --exclude-ignore=exclude.txt dirA
--exclude-ignore-recursive=FILE
除外する対象を各ディレクトリに配置された FILE から読み込みます。FILE はそのディレクトリと配下のサブディレクトリに適用されます。
$ cat dirA/exclude.txt
*.log
*.bak
old
$ tar cvf dirA.tar --exclude-ignore-recursive=exclude.txt dirA
--exclude-tag=FILE
--exclude-tag-all=FILE
--exclude-tag-under=FILE
FILE で指定した名前のファイルを含むディレクトリおよびサブディレクトリのファイルを除外します。
  • --exclude-tag : FILE や該当ディレクトリは除外しない。
  • --exclude-tag-under : FILE は除外するが、該当ディレクトリは除外しない。
  • --exclude-tag-all : FILE や該当ディレクトリも除外する。
$ find dirA -type f
dirA/dirB/NO_BACKUP
dirA/dirB/fileB
dirA/dirB/dirC/fileC
$ tar cvf dirA.tar --exclude-tag=NO_BACKUP dirA
dirA/
dirA/dirB/                     # 該当ディレクトリ
tar: dirA/dirB/: contains a cache directory tag NO_BACKUP; contents not dumped
dirA/dirB/NO_BACKUP            # FILE自体
$ tar cvf dirA.tar --exclude-tag-under=NO_BACKUP dirA
dirA/
dirA/dirB/                     # 該当ディレクトリ
tar: dirA/dirB/: contains a cache directory tag NO_BACKUP; contents not dumped
$ tar cvf dirA.tar --exclude-tag-all=NO_BACKUP dirA
dirA/
tar: dirA/dirB/: contains a cache directory tag NO_BACKUP; directory not dumped
--exclude-caches
--exclude-caches-under
--exclude-caches-all
--exclude-tag などと同様ですが、タグファイル名が CACHEDIR.TAG 固定であること、タグファイルの先頭部が"Signature: 8a477f597d28d172789f06886806bc55" である必要がある点が異なります。(参考)
$ find dirA -type f
dirA/dirB/fileB
dirA/dirB/dirC/fileC
$ echo "Signature: 8a477f597d28d172789f06886806bc55" > dirA/dirB/CACHEDIR.TAG
$ tar cvf dirA.tar --exclude-caches dirA
dirA/
dirA/dirB/                     # 該当ディレクトリ
tar: dirA/dirB/: contains a cache directory tag CACHEDIR.TAG; contents not dumped
dirA/dirB/CACHEDIR.TAG         # タグファイル
$ tar cvf dirA.tar --exclude-caches-under dirA
dirA/
dirA/dirB/                     # 該当ディレクトリ
tar: dirA/dirB/: contains a cache directory tag CACHEDIR.TAG; contents not dumped
$ tar cvf dirA.tar --exclude-caches-all dirA
dirA/
tar: dirA/dirB/: contains a cache directory tag CACHEDIR.TAG; directory not dumped
--exclude-vcs
CVS, RCS, SCCS, SVN などのバージョン管理システム(Version Control System)で使用されるファイルを除外します。(詳細)
--exclude-vcs-ignores
バージョン管理システムがサポートする除外ファイル(.cvsignore, .gitignore, .bzrignore, .hgignore)に記述されたファイルを除外します。(詳細)

対象ファイルの包含(inclusion)

-T, --files-from=FILE
FILE に記述されたファイルを対象に加えます。
$ cat files.txt
dirA/fileA
dirA/fileB
$ tar cvf dirA.tar -T files.txt
dirA/fileA
dirA/fileB
--recursion
対象としてディレクトリを指定するとディレクトリ配下のファイルをすべて対象とします(デフォルト)。
--no-recursion
対象としてディレクトリを指定してもディレクトリ配下のファイルは対象としません。

ファイル名マッチング

--ignore-case
--no-ignore-case
除外(exclusion)や包含(inclusion)のパターンマッチングにおいて大文字・小文字を無視するか否かを指定します。--ignore-case は無視します。--no-ignore-case は無視しません(デフォルト)。--ignore-case より後ろに記述されたオプションに対して有効です。下記の例では *.log*.LOG も除外されます。
$ tar cvf dirA.tar --ignore-case --exclude="*.log" dirA
--wildcards
--no-wildcards
除外(exclusion)や包含(inclusion)のパターンマッチングにおいてワイルドカードを使用する・しないを指定します。--wildcards は使用します(デフォルト)。--no-wildcards は使用しません。下記の例では why?.mp3 にマッチするファイルではなく、why?.mp3 というファイルのみを除外します。
$ tar cvf dirA.tar --no-wildcards --exclude="why?.mp3" dirA
--wildcards-match-slash
--no-wildcards-match-slash
ワイルドカードがスラッシュ(/)にマッチするか否かを指定します。--wildcards-match-slash はマッチします(デフォルト)、--no-wildcards-match-slash はマッチしません。しかし、両者で動作が異なるケースが分かりませんでした。どなたかご存じの方がおられれば...
--anchored
--no-anchored
--anchored は「ファイル名の最初にマッチする(包含時のデフォルト)」、--no-anchored は「すべての / の後ろにマッチする(除外時のデフォルト)」と説明されていますが、両者で動作が変わるケースが分かりませんでした。どなたかご存じの方がおられれば...

所有者・グループ

--owner=NAME
--group=NAME
アーカイブ時、ファイルの所有者やグループを NAME にします。NAMEyamada などのユーザー名やグループ名を指定した場合はユーザー名・グループ名とそれから類推されるユーザーID・グループIDが、1000 などのユーザーIDやグループIDを指定した場合はユーザーID・グループIDのみが、yamada:1000 などのユーザー名・グループ名とユーザーID・グループIDを指定した場合はユーザー名・グループ名とユーザーID・グループIDが格納されます。
$ tar cvf dirA.tar --owner=yamada --group=group1 dirA
$ tar cvf dirA.tar --owner=1000 --group=1000 dirA
$ tar cvf dirA.tar --owner=yamada:1000 --group=group1:1000 dirA
--owner-map=FILE
--group-map=FILE
アーカイブ時、所有者やグループのマップ情報ファイルを指定します。下記の例では user1user2のファイルは user3:1003 のファイルとして、group1group2のファイルは group3:1003 のファイルとしてアーカイブされます。
$ cat owner.map
user1 user3:1003
user2 user3:1003
$ cat group.map
group1 group3:1003
group2 group3:1003
$ tar cvf dirA.tar --owner-map=owner.map  --group-map=group.map dirA
--same-owner
展開時、アーカイブ中に記録された 所有者名:所有者ID、グループ名:グループID での展開を試みます。所有者名、グループ名が見つかればその所有者、グループで、見つからなければ所有者ID、グループIDで展開します。これはスーパーユーザーが展開を行う際のデフォルトです。
--no-same-owner
展開時、アーカイブ中に記録された 所有者名:所有者ID、グループ名:グループID は使用せず、自分のユーザーID、グループIDで展開します。これは一般ユーザーが展開を行う際のデフォルトです。
--numeric-owner
展開時、アーカイブ中に記録された 所有者名、グループ名 は使用せず、アーカイブ中の ユーザーIDとグループIDを用いて展開します。

最終更新時刻

--atime-preserve[=METHOD]
アーカイブ時、アーカイブ対象のファイルの最終参照時刻を変更しません。METHOD には replace(ファイルを読み込んだ後に最終参照時刻を戻す方法(デフォルト))、または system(最初から最終参照時刻を変更しない方法) のいずれかを指定します。
--mtime=DATE-OR-FILE
アーカイブ時、アーカイブ中のファイルやディレクトリの最終更新時刻を DATE-OR-FILE に設定します。DATE-OR-FILE には日時を示す文字列や、/ または . ではじまるファイル名を指定できます。ファイル名を指定した場合はそのファイルの最終更新時刻とします。
$ tar cvf dirA.tar dirA --mtime="2025-12-31 00:00:00"
$ tar cvf dirA.tar dirA --mtime=./release.txt
--clamp-mtime
--mtime を、--mtime で指定した日時よりも新しいファイルやディレクトリに対してのみ適用します。
-m, --touch
展開時、アーカイブに含まれる最終更新時刻は使用せず、現在の日時に設定します。

ファイルモード(パーミッション)

--mode=CHANGES
アーカイブ時、アーカイブ中のファイルやディレクトリのモード(パーミッション)を CHANGES に設定します。CHANGES には chmod コマンドの引数を指定できます。8進数も指定できますが、ディレクトリにもファイルにも適用されてしまいます。
$ tar cvf dirA.tar dirA --mode=g-r,o-r
$ tar cvf dirA.tar dirA --mode=644
--no-same-permissions
展開時、アーカイブに含まれるパーミッション情報は使用せず、umask に従ったパーミッションに設定します。一般ユーザーが展開する際のデフォルトです。
-p, --preserve-permissions, --same-permissions
展開時、アーカイブに含まれるパーミッション情報を使用します。スーパーユーザーが展開する際のデフォルトです。
--delay-directory-restore
ディレクトリ展開時、展開が完了するまでディレクトリの更新時刻やパーミッションの設定を遅らせます。これは、アーカイブ中に通常とは異なる順序でディレクトリやファイルが格納されている時に有効です。
--no-delay-directory-restore
--delay-directory-restore オプションの効能をキャンセルします。

拡張属性

--acls
--no-acls
POSIX ACLs のサポートを有効・無効にします。
--selinux
--no-selinux
SELinux コンテキストのサポートを有効・無効にします。
--xattrs
--no-xattrs
拡張属性のサポートを有効・無効にします。
--xattrs-exclude=MASK
--xattrs-include=MASK
MASK で指定した拡張属性キーを除外したり加えたりします。

アーカイブ時オプション

--hard-dereference
アーカイブ時、通常はハードリンクはハードリンクとしてアーカイブしますが、個々の通常ファイルとしてアーカイブします。
-h, --dereference
アーカイブ時、シンボリックリンク先を探索してシンボリックリンク先のファイルもアーカイブします。このオプション付きでアーカイブされたファイルを展開する際はシンボリックリンクではなくディレクトリや通常ファイルとして展開されます。
--one-file-system
アーカイブ時、-h オプションでシンボリックリンク先も参照する場合であっても、他のファイルシステムにまたがる探索は行いません。ファイルシステム自体のバックアップを取得する際などに有効です。
--remove-files
アーカイブ時、アーカイブしたファイルやディレクトリを削除します。
$ ls -lF
drwxr-xr-x 3 yamada yamada  4096 Aug 11 06:35 dirA/
$ tar cvf dirA.tar dirA --remove-files
$ ls -lF
drwxr-xr-x 3 yamada yamada  4096 Aug 11 06:36 dirA.tar
-W, --verify
アーカイブ時、アーカイブしたファイルやディレクトリを確認(ベリファイ)します。
$ tar cvf dirA.tar -W dirA
dirA/
dirA/fileA.py
Verify dirA/
Verify dirA/fileA.py
--sort=ORDER
アーカイブ時、ディレクトリの探索順序を指定します。ORDER には下記のいずれかを指定します。
  • none : OSが返却する順序に従います(デフォルト)。
  • name : ディレクトリ名順にソートします。
  • inode : iノード順にソートします。アーカイブ時間を減らせる可能性があります。

展開時オプション

-K, --starting-file=MEMBER-NAME
展開時、MEMBER-NAME で指定したファイルがアーカイブ中に出現するまでアーカイブファイルを読み飛ばします。磁器テープにアーカイブしていた頃の名残かもしれません。
-N, --newer=DATE-OR-FILE, --after-date=DATE-OR-FILE
展開時、アーカイブ中のファイルの最終変更時刻が DATE-OR-FILE で指定した日時よりも新しいファイルのみを対象とします。DATE-OR-FILE/ または . で始まる場合はファイル名と見なされ、そのファイルの最終変更時刻よりも新しいファイルのみを対象とします。
$ tar xvf dirA.tar --newer="2025-08-01 00:00:00"
$ tar xvf dirA.tar --newer=example.dat
--newer-mtime=DATE-OR-FILE
--newer と同様ですが、最終変更時刻(内容や属性が変更された時刻)ではなく、最終更新時刻(内容が変更された時刻)を基準とする点が異なります。
-s, --preserve-order, --same-order
展開時、引数で指定したファイルの順序が、アーカイブ中の順序と一致していることを示します。これにより、展開時間を短くできる可能性があります。
--to-command=COMMAND
ファイルを展開する代わりにファイルの内容を COMMAND にパイプで渡します。現在のバージョンでは通常ファイルのみサポートしています。下記の環境変数も渡します。
  • TAR_FILETYPE : ファイル種別。現バージョンでは通常ファイル(f)のみ。
  • TAR_MODE : 8進数のファイルモード(例: 0644)。
  • TAR_FILENAME : 展開するファイル名
  • TAR_REALNAME : アーカイブ中のファイル名。
  • TAR_UNAME : 所有者。
  • TAR_GNAME : グループ。
  • TAR_UID : 所有者ID。
  • TAR_GID : グループID。
  • TAR_ATIME : 最終参照時刻(1970/1/1 00:00:00 UTCからの秒数)。
  • TAR_MTIME : 最終更新時刻(1970/1/1 00:00:00 UTCからの秒数)。
  • TAR_CTIME : 最終変更時刻(1970/1/1 00:00:00 UTCからの秒数)。
  • TAR_SIZE : ファイルサイズ。
  • TAR_VERSION : GNU tar のバージョン(例: 1.35)
  • TAR_ARCHIVE : アーカイブファイル(例: src.tar)
  • TAR_BLOCKING_FACTOR : ブロッキング係数(1レコード中のブロック数)。テープ使用時代の名残。
  • TAR_VOLUME : 処理中のボリューム番号。テープ使用時代の名残。
  • TAR_FORMAT : フォーマット(例: gnu)。
$ cat cmd.sh
#!/bin/bash
echo $TAR_FILENAME >> extract.log
$ tar xvf dirA.tar --to-command=./cmd.sh
--ignore-command-error
--to-command で指定したコマンドの終了コードを無視します。
--no-ignore-command-error
--to-command で指定したコマンドの終了コードを無視しません。
-O, --to-stdout
ファイルを展開する代わりにファイルの内容を標準出力に出力します。
$ mkdir dirA
$ echo AAA > dirA/fileA
$ echo BBB > dirA/fileB
$ tar cvf dirA.tar dirA
$ tar xf dirA.tar -O
AAA
BBB
-n, --seek
--no-seek
-t-x 実行時にアーカイブがシーク可能か否かを指定します。通常は自動判断されますが、自動判断できない場合に指定します。テープ媒体にアーカイブしていた頃に必要だったオプションかもしれません。
--occurrence[=NUMBER]
対象ファイルがアーカイブ中に複数含まれている場合、-t, -x, -d, --delete オプションで NUMBER 番目のファイルのみを参照します。 対象ファイルをコマンド引数や -T オプションで指定している場合に有効です。
$ mkdir dirA
$ echo A > dirA/fileA
$ tar cvf dirA.tar dirA/fileA                               # fileAをアーカイブする
$ echo AA > dirA/fileA                                      # fileAを更新する
$ tar rvf dirA.tar dirA/fileA                               # fileAを追加アーカイブする
$ tar tvf dirA.tar dirA/fileA                               # fileAは2個含まれている
-rw-r--r-- yamada/yamada     2 2025-08-12 10:55 dirA/fileA
-rw-r--r-- yamada/yamada     3 2025-08-12 10:56 dirA/fileA
$ tar tvf dirA.tar --occurrence=1 dirA/fileA             # 1番目のfileAを参照する
-rw-r--r-- yamada/yamada     2 2025-08-12 10:55 dirA/fileA
$ tar tvf dirA.tar --occurrence=2 dirA/fileA             # 2番目のfileAを参照する
-rw-r--r-- yamada/yamada     3 2025-08-12 10:56 dirA/fileA
--one-top-level[=DIR]
展開時、DIR ディレクトリを作成し、その配下に展開します。DIR を省略した場合はアーカイブファイルから .tar.tgz などの拡張子を取り除いたものを DIR とします。展開時、カレントディレクトリ直下にファイルが作成されてしまうのを防ぎます。
$ tar xvf dirA.tar --one-top-level=tmp
$ ls -lF
drwxr-xr-x 2 yamada yamada  4096 Aug 11 06:26 tmp/
-rw-r--r-- 1 yamada yamada 10240 Aug 11 06:25 dirA.tar

上書き制御

--overwrite
展開するファイルがすでに存在する場合、上書きします。
-U, --unlink-first
展開するファイルがすでに存在する場合、該当ファイルを削除してから展開します。
-k, --keep-old-files
展開するファイルがすでに存在する場合、上書きせずエラーとします。
--skip-old-files
展開するファイルがすでに存在する場合、上書きせずスキップとします。
--keep-newer-files
展開するファイルがすでに存在する場合、上書きするファイルの方が新しければ上書きし、上書きされる方が新しい場合はそれを残します。
--keep-directory-symlink
展開するディレクトリがすでにシンボリックリンクとして存在する場合、シンボリックリンクのままとします。このオプションを指定しない場合、シンボリックリンクはディレクトリに置き換えられます。
--overwrite-dir
--no-overwrite-dir
展開するディレクトリがすでに存在する場合、所有者やパーミッションを上書きするか否かを指定します。--overwrite-dir は上書きします(デフォルト)、--no-overwrite-dir は上書きしません。
--recursive-unlink
展開するディレクトリがすでに存在する場合、ディレクトリ配下のすべてのファイルを再帰的に削除してから展開します。

バックアップ

--backup[=CONTROL]
アーカイブ時に同名のアーカイブファイルがすでに存在する場合や、展開先に同名のファイルが既に存在する場合、バックアップファイルを作成します。CONTROL には下記のいずれかを指定します。
  • none : バックアップを作成せず上書きします。
  • simple : ファイル名の末尾に ~ をつけたシンプルなバックアップを作成します(デフォルト)。
  • numbered : ファイル名の末尾に .~n~ (n=1, 2, 3...)をつけたバックアップを作成します。
  • existing : 番号タイプのバックアップが存在すれば番号タイプ、存在しなければシンプルタイプのバックアップを作成します。
--suffix=STRING
バックアップ時のサフィックスを ~ から STRING に変更します。

インクリメンタルバックアップ

-g, --listed-incremental=FILE
インクリメンタルバックアップを行います。前回のバックアップから更新のあったファイルのみをアーカイブすることで、バックアップ容量を節約します。下記の例では src.1.tarsrc.2.tar が作成されます。src.1.tar を展開したものに src.2.tar を上書き展開することで最新の src をリストアすることができます。
$ mkdir src                               # srcディレクトリを作成
$ echo A > src/fileA.py                   # fileA.py を作成
$ echo B > src/fileB.py                   # fileB.py を作成
$ tar cvf src.1.tar -g inc.txt src        # 1回目のインクリメンタルバックアップ(src.1.tar)
tar: src: Directory is new
src/
src/fileA.py
src/fileB.py
$ echo AA > src/fileA.py                  # fileA.py を更新
$ tar cvf src.2.tar -g inc.txt src        # 2回目のインクリメンタルバックアップ(src.2.tar)
src/
src/fileA.py                              # 更新された fileA.py しかアーカイブされない
-G, --incremental
-g と同様ですが、-g は新GNUフォーマット、-G は旧GNUフォーマットでバックアップを作成する点が異なります。
--level=NUMBER
-g によるインクリメンタルバックアップの世代数を指定します。現状、--level=0 のみ意味を持ち、バックアップ実行前に FILE をクリアして全バックアップを取得します。
$ tar cvf src.0.tar -g inc.txt --level=0 src
--check-device
--no-check-device
マニュアルではインクリメンタルアーカイブを作成する際に、デバイス番号をチェックする(デフォルト)・チェックしないと説明されています。デバイス番号とは stat コマンドで表示される Device: 情報(st_dev)と思われますが、1回目と2回目で異なるファイルシステムでバックアップを取りましたが、チェックする場合としない場合の動作の差異を確認することができませんでした。どなたか差異がわかるケースをご存じの方がおられましたら...
--show-snapshot-field-ranges
インクリメンタルバックアップのスナップショットファイルに記録されるフィールドの最小値、最大値を表示します。
$ tar --show-snapshot-field-ranges
This tar's snapshot file field ranges are
   (field name      => [ min, max ]):

    nfs             => [ 0, 1 ],
    timestamp_sec   => [ -9223372036854775808, 9223372036854775807 ],
    timestamp_nsec  => [ 0, 999999999 ],
    dev             => [ 0, 18446744073709551615 ],
    ino             => [ 0, 18446744073709551615 ],

スパースファイル

-S, --sparse
スパースファイル を効率的に扱います。アーカイブ対象のファイルがスパースファイルであれば、アーカイブサイズを小さくすることが期待できます。
--sparse-version=MAJOR[.MINOR]
スパースファイルをアーカイブする際のバージョンを指定します。MAJOR.MINOR には 0.0, 0.1, 1.0 のいずれかを指定します。-S オプションも自動的に付加されます。詳細は Storing Sparse Files を参照してください。
--hole-detection=TYPE
hole はスパースファイルの未使用領域を意味します。TYPE には raw(未使用領域も読み込む)、seek(未使用領域は読み飛ばす) のいずれかを指定します。圧縮率は raw モードの方がよい時もあるようですが、seek は巨大な未使用領域を含むファイルがある場合にアーカイブ時間を短縮することができます。
$ dd if=/dev/zero of=example.dat bs=1024 seek=1M count=1000            # スパースファイルを作成する
$ tar cvf example-raw.tar --hole-detection=raw example.dat             # rawモードでアーカイブする
$ tar cvf example-seek.tar --hole-detection=seek example.dat           # seekモードでアーカイブする
$ ls -l *
-rw-r--r-- 1 yamada yamada      10240 Aug 10 05:06 example-raw.tar
-rw-r--r-- 1 yamada yamada    1034240 Aug 10 05:06 example-seek.tar
-rw-r--r-- 1 yamada yamada 1074765824 Aug 10 05:06 example.dat

マルチボリューム

-M, --multi-volume
アーカイブ先に磁器テープを使用していた頃の名残で、複数のテープを用いたアーカイブを行っていました。
-L, --tape-length=NUMBER
アーカイブ先に磁器テープを使用していた頃の名残で、テープの長さを 1024 バイト× NUMBER で指定していました。暗黙的に -M オプションも設定されます。
-F, --info-script=NAME, --new-volume-script=NAME
アーカイブ先に磁器テープを使用していた頃の名残で、テープの終端(EOF)を検出するためのコマンド(mtコマンドなど)を指定していました。
--volno-file=FILE
--multi-volume を使用すると、マルチボリュームの中のどのボリュームにどの処理を行ったかを FILE に記録します。

リモートボリューム

--rsh-command=COMMAND
リモートアーカイブ(--file=host:file)にアクセスするためのコマンドとして rsh の代わりに使用するコマンドを指定します。
--rmt-command=COMMAND
アーカイブ先に磁器テープを使用していた頃の名残で、リモートの磁気テープにアクセスするためのコマンドとして rmt の代わりに使用するコマンドを指定していました。
--force-local
アーカイブ中のファイル名にコロン(:)が含まれていてもローカルファイルとして扱います。

ブロックデバイス

-b, --blocking-factor=BLOCKS
ブロックデバイスにアーカイブする場合、1レコードあたりのブロック数を BLOCKS とします。大抵の場合デフォルト値は 20 です。
--record-size=NUMBER
レコードサイズ(バイト数)を 512 の倍数で指定します。10K, 1M のような単位をつけることもできます。
-B, --read-full-records
展開の際、末尾のレコード長が不完全であっても許容します。
-i, --ignore-zeros
通常、0 で埋められた 512 バイトブロックが2回連続するとファイルの終端(EOF)を意味しますが、それを無視します。

アーカイブフォーマット

-H, --format=FORMAT
アーカイブフォーマットを指定します。
  • gnu : GNU tar 1.13.x 以降のフォーマット(デフォルト)
  • oldgnu : GNU tar 1.12 以前のフォーマット
  • pax : POSIX 1003.1-2001 (pax) フォーマット
  • posix : pax と同等
  • ustar : POSIX 1003.1-1988 (ustar) フォーマット
  • v7 : 古い V7 フォーマット
--old-archive, --portability
--format=v7 と同等です。
--pax-option=keyword[[:]=value][,keyword[[:]=value]]...
pax フォーマットのためのキーワードや値を指定します。pax コマンドの -o オプションに相当します。
--posix
--format=posix と同等です。

ボリュームラベル

-V, --label=TEXT
アーカイブ時に指定すると、アーカイブファイルにラベルをつけます。展開時に指定すると、ラベルにマッチするアーカイブファイルからのみ展開を行います。展開時にはワイルドカードを使用できます。
$ tar cvf backup.tar --label="BACKUP_20251231_1" src
$ tar xvf backup.tar --label="BACKUP_20251231*"
--test-label
--label=LABEL でつけたアーカイブのラベルを表示します。
$ tar --test-label -f backup.tar
BACKUP_20251231_1

パス名制御

--null
-T オプションで読み込むファイルは改行ではなくヌル文字(NUL)で区切られているものとします。改行を含むファイルを安全に処理するのに有効です。--verbatim-files-from オプションも自動追加されます。
$ find src -type f -print0 > files.txt
$ tar cvf src.tar -T files.txt
--no-null
-T オプションで読み込むファイルはヌル文字(NUL)ではなく改行で区切られているものとします(デフォルト)。
--verbatim-files-from
-T オプションで読み込むファイルの各行はエスケープ文字やハイフン(-)なども特殊処理したりオプションと身なりたりせず、そのままのファイル名として扱います。
--no-verbatim-files-from
-T オプションで読み込むファイルの各行のハイフン(-)で始まる行をオプションとして扱います(デフォルト)。
--unquote
コマンドラインで指定した \t, \n などをタブ文字、改行文字などとして扱います(デフォルト)。
$ tar cvf archive.tar "AAA\nBBB"
--no-unquote
コマンドラインで指定した \t, \n などをタブ文字、改行文字などとして扱いません。
-P, --absolute-names
アーカイブ時や展開時、パス名の先頭が / であれば通常取り除きますが、このオプションを指定すると取り除きません。
--transform=EXPRESSION, --xform=EXPRESSION
アーカイブ読込時、ファイルのパス名を sed コマンドに EXPRESSION で変換します。
$ tar xvf src.tar --transform='s/^src/src_tmp/'
--strip-components=NUMBER, --strip=NUMBER
アーカイブ読込時、ファイルのパス名から先頭 NUMBER 個のディレクトリ名を取り除きます。
$ tar xvf src.tar --strip-components=3
--show-transformed-names, --show-stored-names
--transform--strip-components でパス名が変更される場合、変更後のパス名を表示します。
--quote-chars=STRING
ファイル名を表示する際に STRING で指定した文字群をバックスラッシュ(\)でクォートします。
--no-quote-chars=STRING
--quote-chars で指定した文字群から STRING を除外します。
--quoting-style=STYLE
特殊文字に対するクォートスタイル(エスケープスタイル)を指定します。
  • literal : クォートしません。そのまま表示します。(例: A'B"C → A'B"C)
  • shell : シェルと同様のクォートを行います。(例: A'B"C → 'A'\''B'\"'C')
  • shell-always : シェルと同様ですが常に全体を '...' で囲みます。
  • c : C言語的なクォートを行います。(例: A'B"C → "A'B\"C")
  • escape : 制御文字を \t などで表示します。(例: A(tab)B → A\tB)
  • locale : 全体を '...' で囲み、\t\' を使用します。
  • clocale : 全体を "..." で囲み、\t\" を使用します。

表示制御

--full-time
-t オプションで最終更新時刻を高精度で(秒まで)表示します。
--utc
日時を UTC で表示します。

進捗メッセージ

--checkpoint[=NUMBER]
アーカイブ時や展開時、NUMBER レコード毎に進捗メッセージを表示します。
--checkpoint-action=ACTION
チェックポイント毎に ACTION を実行します。
-R, --block-number
それぞれのメッセージにブロック番号を付加して表示します。
$ tar cvf src.tar src -R
block 0: src/
block 1: src/fileA.py
block 3: src/fileC.py
block 5: src/fileB.py
--show-omitted-dirs
アーカイブを読み込む際、検索にマッチせずスキップされたディレクトリ名を表示します。
$ tar xvf src.tar src/dirC --show-omitted-dirs
tar: src/dirA: Omitting
tar: src/dirB: Omitting
src/dirC
--totals[=SIGNAL]
処理完了後にトータルバイト数を表示します。SIGNAL を指定すると指定したシグナルを受け取った時にも表示します。SIGNAL には SIGHUP, SIGQUIT, SIGINT, SIGUSR1, SIGUSR2 のいずれかを指定できます。SIG は省略することもできます。
$ tar cvf src.tar src --totals=HUP
--index-file=FILE
-v オプションの出力先を FILE にします。

警告メッセージ

--warning=KEYWORD
警告メッセージを制御します。KEYWORD を指定するとそのメッセージを表示します。KEYWORD の先頭に no- をつけるとメッセージを抑制します。複数指定することができます。(詳細)
$ tar xcf src.tar --warning=symlink-cast --warning=no-existing-file
-l, --check-links
アーカイブ時、ハードリンクファイルが含まれているけれども、一部のハードリンクがアーカイブ対象外のディレクトリにあるなど、すべてのハードリンクがアーカイブされなかった時にエラーメッセージを表示します。
--ignore-failed-read
読み込めないファイルがあった場合、エラーメッセージは表示しますが、コマンドの終了ステータスをエラー(0以外)とはしません。
$ tar cvf archive.tar --ignore-failed-read dirA
dirA/
tar: dirA/fileA: Warning: Cannot open: Permission denied
$ echo $?
0

情報表示

-?, --help
ヘルプを表示して終了します。
--version
バージョン情報を表示して終了します。
--usage
簡単な使用法メッセージを表示して終了します。
--show-defaults
tar コマンドのデフォルト値を表示します。
$ tar --show-defaults          # RHEL 10
--format=gnu -f- -b20 --quoting-style=escape --rmt-command=/etc/rmt --rsh-command=/usr/bin/ssh
$ tar --show-defaults          # Ubuntu 24.04
--format=gnu -f- -b20 --quoting-style=escape --rmt-command=/usr/sbin/rmt --rsh-command=/usr/bin/rsh

その他

-C, --directory=DIR
アーカイブや展開などを DIR ディレクトリに移動してから実行します。
$ mkdir tmp
$ tar xvf src.tar -C tmp
-w, --interactive, --confirmation
すべてのアクションに対して実行可否の確認プロンプトを表示します。
--restrict
有害かもしれないいくつかのオプションを無効にします。現在のバージョンではマルチボリューム使用時の -F によるコマンド起動を無効にします。
-o
互換性のために残されているオプションです。アーカイブ作成時は --old-archive、アーカイブ展開時は --no-same-owner オプションと同等です。