tar コマンド
目次
概要
tar - 複数ファイルをアーカイブするコマンドライン
Usage: tar [OPTION...] [FILE]...
対象バージョン
- RHEL 10 : GNU tar 1.35
- Ubuntu 24.04 : GNU tar 1.35
説明
概要
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
にします。NAME
にyamada
などのユーザー名やグループ名を指定した場合はユーザー名・グループ名とそれから類推されるユーザー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
- アーカイブ時、所有者やグループのマップ情報ファイルを指定します。下記の例では
user1
やuser2
のファイルはuser3:1003
のファイルとして、group1
やgroup2
のファイルは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.tar
とsrc.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
オプションと同等です。
リンク
- https://linuxjm.sourceforge.io/html/GNU_tar/man1/tar.1.html
- https://www.gnu.org/software/tar/manual/tar.html
Copyright (C) 2025 杜甫々
初版:2025年8月17日 最終更新:2025年8月17日
https://www.tohoho-web.com/linux/cmd/tar.html