いい加減 tar コマンドを覚えるためのまとめ
ファイルのアーカイブ、圧縮、解凍を行える tar
コマンド。オプション引数が覚えられずいつも調べてしまうので、いい加減覚える。
目次
- ヘルプを見てみる
- サンプルコードについて
cvf
: アーカイブを作成するczvf
: gzip で圧縮するxvf
: アーカイブを展開するtf
: 格納されているディレクトリ名・ファイル名を取得する- まとめ表
ヘルプを見てみる
まずはコマンドのヘルプを見てみる。
BSD tar
MacOS Mojave に入っている BSD tar のヘルプはこんな感じ。
$ tar --help
tar(bsdtar): manipulate archive files
First option must be a mode specifier:
-c Create -r Add/Replace -t List -u Update -x Extract
Common Options:
-b # Use # 512-byte records per I/O block
-f <filename> Location of archive
-v Verbose
-w Interactive
Create: tar -c [options] [<file> | <dir> | @<archive> | -C <dir> ]
<file>, <dir> add these items to archive
-z, -j, -J, --lzma Compress archive with gzip/bzip2/xz/lzma
--format {ustar|pax|cpio|shar} Select archive format
--exclude <pattern> Skip files that match pattern
-C <dir> Change to <dir> before processing remaining files
@<archive> Add entries from <archive> to output
List: tar -t [options] [<patterns>]
<patterns> If specified, list only entries that match
Extract: tar -x [options] [<patterns>]
<patterns> If specified, extract only entries that match
-k Keep (don't overwrite) existing files
-m Don't restore modification times
-O Write entries to stdout, don't restore to disk
-p Restore permissions (including ACLs, owner, file flags)
bsdtar 2.8.3 - libarchive 2.8.3
シンプルで分かりやすい。crtux
のどれかからやりたいことを選んで、共通オプションとして vf
あたりがあって、Create 時は zjJ
などが使えるよ、と。
GNU tar
次は CentOS 7 に含まれている GNU tar を見る。
$ tar --version
tar (GNU tar) 1.26
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ tar --help
Usage: tar [OPTION...] [FILE]...
GNU `tar' saves many files together into a single tape or disk archive, and can
restore individual files from the archive.
Examples:
tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.
tar -tvf archive.tar # List all files in archive.tar verbosely.
tar -xf archive.tar # Extract all files from archive.tar.
Main operation mode:
-A, --catenate, --concatenate append tar files to an archive
-c, --create create a new archive
-d, --diff, --compare find differences between archive and file system
--delete delete from the archive (not on mag tapes!)
-r, --append append files to the end of an archive
-t, --list list the contents of an archive
--test-label test the archive volume label and exit
-u, --update only append files newer than copy in archive
-x, --extract, --get extract files from an archive
Operation modifiers:
--check-device check device numbers when creating incremental
archives (default)
-g, --listed-incremental=FILE handle new GNU-format incremental backup
-G, --incremental handle old GNU-format incremental backup
--ignore-failed-read do not exit with nonzero on unreadable files
--level=NUMBER dump level for created listed-incremental archive
-n, --seek archive is seekable
--no-check-device do not check device numbers when creating
incremental archives
--no-seek archive is not seekable
--occurrence[=NUMBER] process only the NUMBERth occurrence of each file
in the archive; this option is valid only in
conjunction with one of the subcommands --delete,
--diff, --extract or --list and when a list of
files is given either on the command line or via
the -T option; NUMBER defaults to 1
--sparse-version=MAJOR[.MINOR]
set version of the sparse format to use (implies
--sparse)
-S, --sparse handle sparse files efficiently
Overwrite control:
-k, --keep-old-files don't replace existing files when extracting,
treat them as errors
--keep-directory-symlink preserve existing symlinks to directories when
extracting
--keep-newer-files don't replace existing files that are newer than
their archive copies
--no-overwrite-dir preserve metadata of existing directories
--overwrite overwrite existing files when extracting
--overwrite-dir overwrite metadata of existing directories when
extracting (default)
--recursive-unlink empty hierarchies prior to extracting directory
--remove-files remove files after adding them to the archive
--skip-old-files don't replace existing files when extracting,
silently skip over them
-U, --unlink-first remove each file prior to extracting over it
-W, --verify attempt to verify the archive after writing it
Select output stream:
--ignore-command-error ignore exit codes of children
--no-ignore-command-error treat non-zero exit codes of children as
error
-O, --to-stdout extract files to standard output
--to-command=COMMAND pipe extracted files to another program
Handling of file attributes:
--atime-preserve[=METHOD] preserve access times on dumped files, either
by restoring the times after reading
(METHOD='replace'; default) or by not setting the
times in the first place (METHOD='system')
--delay-directory-restore delay setting modification times and
permissions of extracted directories until the end
of extraction
--group=NAME force NAME as group for added files
--mode=CHANGES force (symbolic) mode CHANGES for added files
--mtime=DATE-OR-FILE set mtime for added files from DATE-OR-FILE
-m, --touch don't extract file modified time
--no-delay-directory-restore
cancel the effect of --delay-directory-restore
option
--no-same-owner extract files as yourself (default for ordinary
users)
--no-same-permissions apply the user's umask when extracting permissions
from the archive (default for ordinary users)
--numeric-owner always use numbers for user/group names
--owner=NAME force NAME as owner for added files
-p, --preserve-permissions, --same-permissions
extract information about file permissions
(default for superuser)
--preserve same as both -p and -s
--same-owner try extracting files with the same ownership as
exists in the archive (default for superuser)
-s, --preserve-order, --same-order
member arguments are listed in the same order as
the files in the archive
Handling of extended file attributes:
--acls Enable the POSIX ACLs support
--no-acls Disable the POSIX ACLs support
--no-selinux Disable the SELinux context support
--no-xattrs Disable extended attributes support
--selinux Enable the SELinux context support
--xattrs Enable extended attributes support
--xattrs-exclude=MASK specify the exclude pattern for xattr keys
--xattrs-include=MASK specify the include pattern for xattr keys
Device selection and switching:
-f, --file=ARCHIVE use archive file or device ARCHIVE
--force-local archive file is local even if it has a colon
-F, --info-script=NAME, --new-volume-script=NAME
run script at end of each tape (implies -M)
-L, --tape-length=NUMBER change tape after writing NUMBER x 1024 bytes
-M, --multi-volume create/list/extract multi-volume archive
--rmt-command=COMMAND use given rmt COMMAND instead of rmt
--rsh-command=COMMAND use remote COMMAND instead of rsh
--volno-file=FILE use/update the volume number in FILE
Device blocking:
-b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record
-B, --read-full-records reblock as we read (for 4.2BSD pipes)
-i, --ignore-zeros ignore zeroed blocks in archive (means EOF)
--record-size=NUMBER NUMBER of bytes per record, multiple of 512
Archive format selection:
-H, --format=FORMAT create archive of the given format
FORMAT is one of the following:
gnu GNU tar 1.13.x format
oldgnu GNU format as per tar <= 1.12
pax POSIX 1003.1-2001 (pax) format
posix same as pax
ustar POSIX 1003.1-1988 (ustar) format
v7 old V7 tar format
--old-archive, --portability
same as --format=v7
--pax-option=keyword[[:]=value][,keyword[[:]=value]]...
control pax keywords
--posix same as --format=posix
-V, --label=TEXT create archive with volume name TEXT; at
list/extract time, use TEXT as a globbing pattern
for volume name
Compression options:
-a, --auto-compress use archive suffix to determine the compression
program
-I, --use-compress-program=PROG
filter through PROG (must accept -d)
-j, --bzip2 filter the archive through bzip2
-J, --xz filter the archive through xz
--lzip filter the archive through lzip
--lzma filter the archive through lzma
--lzop
--no-auto-compress do not use archive suffix to determine the
compression program
-z, --gzip, --gunzip, --ungzip filter the archive through gzip
-Z, --compress, --uncompress filter the archive through compress
Local file selection:
--add-file=FILE add given FILE to the archive (useful if its name
starts with a dash)
--backup[=CONTROL] backup before removal, choose version CONTROL
-C, --directory=DIR change to directory DIR
--exclude=PATTERN exclude files, given as a PATTERN
--exclude-backups exclude backup and lock files
--exclude-caches exclude contents of directories containing
CACHEDIR.TAG, except for the tag file itself
--exclude-caches-all exclude directories containing CACHEDIR.TAG
--exclude-caches-under exclude everything under directories containing
CACHEDIR.TAG
--exclude-tag=FILE exclude contents of directories containing FILE,
except for FILE itself
--exclude-tag-all=FILE exclude directories containing FILE
--exclude-tag-under=FILE exclude everything under directories
containing FILE
--exclude-vcs exclude version control system directories
-h, --dereference follow symlinks; archive and dump the files they
point to
--hard-dereference follow hard links; archive and dump the files they
refer to
-K, --starting-file=MEMBER-NAME
begin at member MEMBER-NAME when reading the
archive
--newer-mtime=DATE compare date and time when data changed only
--no-null disable the effect of the previous --null option
--no-recursion avoid descending automatically in directories
--no-unquote do not unquote filenames read with -T
--null -T reads null-terminated names, disable -C
-N, --newer=DATE-OR-FILE, --after-date=DATE-OR-FILE
only store files newer than DATE-OR-FILE
--one-file-system stay in local file system when creating archive
-P, --absolute-names don't strip leading `/'s from file names
--recursion recurse into directories (default)
--suffix=STRING backup before removal, override usual suffix ('~'
unless overridden by environment variable
SIMPLE_BACKUP_SUFFIX)
-T, --files-from=FILE get names to extract or create from FILE
--unquote unquote filenames read with -T (default)
-X, --exclude-from=FILE exclude patterns listed in FILE
File name transformations:
--strip-components=NUMBER strip NUMBER leading components from file
names on extraction
--transform=EXPRESSION, --xform=EXPRESSION
use sed replace EXPRESSION to transform file
names
File name matching options (affect both exclude and include patterns):
--anchored patterns match file name start
--ignore-case ignore case
--no-anchored patterns match after any `/' (default for
exclusion)
--no-ignore-case case sensitive matching (default)
--no-wildcards verbatim string matching
--no-wildcards-match-slash wildcards do not match `/'
--wildcards use wildcards (default)
--wildcards-match-slash wildcards match `/' (default for exclusion)
Informative output:
--checkpoint[=NUMBER] display progress messages every NUMBERth record
(default 10)
--checkpoint-action=ACTION execute ACTION on each checkpoint
--full-time print file time to its full resolution
--index-file=FILE send verbose output to FILE
-l, --check-links print a message if not all links are dumped
--no-quote-chars=STRING disable quoting for characters from STRING
--quote-chars=STRING additionally quote characters from STRING
--quoting-style=STYLE set name quoting style; see below for valid STYLE
values
-R, --block-number show block number within archive with each message
--show-defaults show tar defaults
--show-omitted-dirs when listing or extracting, list each directory
that does not match search criteria
--show-transformed-names, --show-stored-names
show file or archive names after transformation
--totals[=SIGNAL] print total bytes after processing the archive;
with an argument - print total bytes when this
SIGNAL is delivered; Allowed signals are: SIGHUP,
SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; the names
without SIG prefix are also accepted
--utc print file modification times in UTC
-v, --verbose verbosely list files processed
--warning=KEYWORD warning control
-w, --interactive, --confirmation
ask for confirmation for every action
Compatibility options:
-o when creating, same as --old-archive; when
extracting, same as --no-same-owner
Other options:
-?, --help give this help list
--restrict disable use of some potentially harmful options
--usage give a short usage message
--version print program version
Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.
The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
The version control may be set with --backup or VERSION_CONTROL, values are:
none, off never make backups
t, numbered make numbered backups
nil, existing numbered if numbered backups exist, simple otherwise
never, simple always make simple backups
Valid arguments for the --quoting-style option are:
literal
shell
shell-always
c
c-maybe
escape
locale
clocale
*This* tar defaults to:
--format=gnu -f- -b20 --quoting-style=escape --rmt-command=/etc/rmt
--rsh-command=/usr/bin/ssh
Report bugs to <bug-tar@gnu.org>.
長い。BSD tar よりも高機能なのかしら。
サンプルコードについて
以降は、BSD tar・GNU tar どちらでも有効なコマンドを紹介する。動作に差がある場合はそれぞれ説明する。
サンプルとして以下のようなファイルを用意した。これらのファイルを指定して圧縮したり解凍したりした時にどうなるか見てみる。
$ tree
/tar-test/
├── file-1.txt
├── file-2.txt
└── my-directory
├── inner-file-1.txt
└── inner-file-2.txt
BSD tar は MacOS Mojave 同梱のモノ、GNU tar は CentOS 7 に同梱のモノを使って検証する。
cvf
: アーカイブを作成する
まずは、複数のファイルを一つのファイルにまとめるだけのやり方から。tar
コマンドは Tape ARchive の略で、圧縮機能はそのオプション。ar
というコマンドもあったんだとか。アーカイブにまとめたファイルを「Tarball」と呼んだりする。
# file-1・file-2 を dest.tar という1ファイルにまとめる
$ tar -c -f ./dest.tar ./file-1.txt ./file-2.txt
# 1文字のオプションはハイフンも不要
$ tar cf ./dest.tar ./file-1.txt ./file-2.txt
# 「v」を付けるとどのファイルを操作しているか詳細が出力される
# 以下は BSD tar の場合。「a」は「Add」の意味
$ tar cvf ./dest.tar ./file-1.txt ./file-2.txt
a ./file-1.txt
a ./file-2.txt
# 同じコマンドを BSD tar で。出力のされ方が違うが効果は同じ
$ tar cvf ./dest-gnu.tar ./file-1.txt ./file-2.txt
./file-1.txt
./file-2.txt
-c
とかのハイフンはなくてもあっても大丈夫。繋げて書いても OK。
古くからあるコマンドなんで「
-
を打つのさえめんどくさい、ファッキュー!」な人がこんな事をしたんだと思います。多分。
…というワケで、単にアーカイブにまとめるだけなら、
$ tar cvf 【出力ファイル名】.tar 【追加するファイルやディレクトリを複数指定できる】
コレで覚えておこう。
動作に必要なのは c
(Create) と f
(File) だけだが、何をアーカイブにまとめているかは確認できた方が良いので、v
(Verbose) も入れておこう。
-f
オプションはアーカイブするファイル名を指定したりするオプションなので、tar cfv
などのようにオプションの途中に書くと動かない場合がある、らしい。ただ、手元の BSD tar と GNU tar で試した限りは、途中に書いても大丈夫だった。とはいえ、余計なトラブルを防ぐためにも、f
オプションは最後に書き、直後にファイル名を羅列していく、と覚えておこう。
czvf
: gzip で圧縮する
先程の cvf
に z
オプションを付けると、gzip 形式で圧縮できる。Tar でまとめつつ圧縮するので、拡張子は .tar.gz
と付けるのが慣例。gzip は GNU Zip の略で、Windows でよく見かける Zip 形式とは圧縮の方式が違う。
Mac・CentOS ともに、gzip
(圧縮)、gunzip
(解凍) というコマンドもある。tar cz
(--gzip
圧縮)、tar xz
(--gunzip
解凍) とほぼ同じ。
- 参考 : gzip - Wikipedia
# 「c」「z」「v」は順不同
$ tar czvf dest.tar.gz ./my-directory/
a ./my-directory
a ./my-directory/inner-file-1.txt
a ./my-directory/inner-file-2.txt
# こう書いても同じ
$ tar cv --gzip -f dest.tar.gz ./my-directory/
GNU tar のみ、z
の代わりに a
オプションを渡すと、ファイル名に指定した拡張子から自動的に判断して gzip 形式で圧縮してくれる。BSD tar では a
オプションはないのでエラーになるし、自動判別機能もない。
# 拡張子から判断して gzip 形式で圧縮する
$ tar cavf dest-gnu.tar.gz ./my-directory/
a
オプションを使って本当に gzip で圧縮されたかどうかは、cvf
で単にアーカイブした場合のファイルと czvf
でアーカイブ + gzip 圧縮した場合のファイルを別途生成し、ファイルサイズを比較してみれば良い。
GNU tar の a
オプションは便利なものの、BSD tar では使えないので、素直に czvf
で覚えた方が良いかと。
cjvf
: bzip2 形式で圧縮する
z
以外のオプションとして、j
オプションがある。コレは bzip2 という圧縮フォーマットで圧縮するモノ。gzip より圧縮率が高いが、処理速度が遅い。拡張子は .tar.bz2
が慣例。bzip2 と言うだけあって、「bzip」は原型であり別物なので注意。今はもう bzip2 形式しか見ないと思う。
$ tar cjvf dest.tar.bz2 ./my-directory/
Mac には bzip2
(圧縮)、bunzip2
(解凍) コマンドがあったが、CentOS には入っていなかった。また、CentOS 7 に同梱の GNU tar だと j
オプションでの圧縮・展開がいずれも動作しなかった。BSD tar で圧縮した .tar.bz2
を持ち込んで CentOS で tar xjvf
などとしてみたがダメ。どうもこの GNU tar は bzip2 形式での圧縮・解凍には対応していないっぽい?あんま使うことないから気にしなくていっか。
cJvf
: xz 形式で圧縮する
小文字の j
が bzip2 形式での圧縮だったが、大文字の J
にすると xz という圧縮フォーマットを使う。gzip・bzip2 より後発で、圧縮率・処理速度は概ね良好な形式。Tar と組み合わせて圧縮した際は .tar.xz
と拡張子を付けるのが慣例。
$ tar cJvf dest.tar.xz ./my-directory/
Mac・CentOS ともに xz
(圧縮)、unxz
(解凍) コマンドが入っていた。
xvf
: アーカイブを展開する
c
で Create (アーカイブの作成) なら、その逆の展開は x
で eXtract。
# 同ディレクトリにある2つのファイルをまとめた場合
$ tar cvf ./dest.tar ./file-1.txt ./file-2.txt
# 展開すると、同ディレクトリに2つのファイルが出力される (つまり元ファイルが上書きされるので注意)
$ tar xvf ./dest.tar
展開時に z
(gzip)・j
(bzip2)・J
(xz) と形式別のオプションを指定することで解凍できるが、最近の BSD tar と GNU tar はいずれも、zjJ
のオプションなしに xf
のみで自動的に解凍 + 展開を行ってくれる。
GNU tar なら a
オプションと拡張子で自動判定して圧縮できるし、解凍時は xvf
で自動判定して解凍してくれるので、もう圧縮形式を覚えておく必要はなくなる。BSD tar は圧縮時に自動判定してくれないが、結局 bzip2 や xz を使う機会はほとんどないので、黙って czvf
⇔ xvf
で対比させておけばよいかと。
tf
: 格納されているディレクトリ名・ファイル名を取得する
xf
で解凍・展開する前に、中身を確認したい時は、tf
を使うと良い。-t
は --list
の略みたい。
$ tar tf bsd.tar.gz
./my-directory/
./my-directory/inner-file-1.txt
./my-directory/inner-file-2.txt
# 「v」を付けると ls -l 的に見える
$ tar tvf bsd.tar.gz
drwxr-xr-x 0 Neo staff 0 3 4 13:57 ./my-directory/
-rw-r--r-- 0 Neo staff 13 3 4 13:57 ./my-directory/inner-file-1.txt
-rw-r--r-- 0 Neo staff 13 3 4 13:57 ./my-directory/inner-file-2.txt
t
も x
と同様、圧縮形式を指定するオプションは不要。v
オプションを渡すと ls -l
同様に詳細が見えるので、tf
でファイル名のみ見るか、tvf
で詳細まで見るかはお好みで。
まとめ表
ということで、ココまでの内容を表形式でまとめ。
tar | Action | Type | Options | Dest File | Source Files... | Alternative | |||
---|---|---|---|---|---|---|---|---|---|
tar | c | (--create) | (指定なし) | (= Tarball) | v f |
(--verbose) (--file) |
./dest.tar | ./source.txt ./sources/ | - |
z | (--gzip) | ./dest.tar.gz | gzip | ||||||
j | (--bzip2) | ./dest.tar.bz2 | bzip2 | ||||||
J | (--xz) | ./dest.tar.xz | xz | ||||||
a | (--auto-compress) | ./dest.tar.【Type】 | ※ GNU tar Only | ||||||
t | (--list) | (指定なし) | (= 自動判別) | ./dest.tar | - | - | |||
x | (--extract) | (指定なし) | (= 自動判別) | ./dest.tar | - | - | |||
z | (--gzip) | ./dest.tar.gz | gunzip | ||||||
j | (--bzip2) | ./dest.tar.bz2 | bunzip2 | ||||||
J | (--xz) | ./dest.tar.xz | unxz |
コレをチートシートしておこうと思う。他にも色々なオプションがあるものの、普段使うのはこのくらいかな。