Linux常用命令-tar

命令

tar

描述

GNU `tar’ saves many files together into a single tape or disk archive, and can restore individual files from the archive.
打包工具

用法

1
tar [OPTION...] [FILE]...

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Options:
-A, --catenate 追加一个tar包的文件到另一个tar包,即合并两个tar包,将后者合并到前者
-c, --create 创建一个tar包
-d, --diff, --compare 比较tar包中的文件和文件系统中的文件是否相同,可用来判断解压后文件是否有修改
-r, --append 追加文件到tar包
-t, --list 显示tar包中的文件列表
-u, --update 追加变更的文件到tar包,否则不追加
-x, --extract, --get 解压tar包

-k, --keep-old-files 解压时保留已存在的文件并提示,而不是直接覆盖
--keep-newer-files 当已存在的文件比tar包中的文件更新时不要覆盖
--remove-files 当文件被添加到tar包后删除原文件
--skip-old-files 跳过已存在的文件
-O, --to-stdout 解压tar包到标准输出
--group=NAME 修改添加到tar包中的文件的所属组
--mode=CHANGES 修改tar包中的文件权限
--owner=NAME 修改添加到tar包中的文件的所有者
-f, --file=ARCHIVE 指定tar包名称
-a, --auto-compress 根据文件名后缀自动判断压缩格式进行打包压缩
-j, --bzip2 使用bzip2压缩
-J, --xz 使用xz压缩
-z, --gzip 使用gzip压缩
-Z, --compress 使用compress压缩
--backup[=CONTROL] 删除或覆盖前先备份,可选参数number,simple等
-C, --directory=DIR 指定解压缩目录
--exclude=PATTERN 排除指定文件,支持通配符,默认为递归排除
-P, --absolute-names 保留文件开头的/路径,即保留绝对路径.注意该选项可能会覆盖系统文件,慎用!
--recursion 递归打包子目录(default)
--no-recursion 不递归打包子目录
--suffix=STRING 指定备份文件的后缀,配合--bakcup使用
-T, --files-from=FILE 指定文件列表
-X, --exclude-from=FILE 排除文件列表
--full-time 显示完整的时间戳
--index-file=FILE 将显示内容保存到指定文件
--show-defaults 显示tar命令的默认选项
--utc 使用UTC时间显示mtime
-v, --verbose 显示详情
-w, --interactive 交互模式,每次操作均提示

File name matching options (affect both exclude and include patterns):
--anchored 匹配文件名
--ignore-case 忽略大小写
--no-anchored patterns match after any `/' (default for exclusion)
--no-ignore-case 区分大小写 (default)
--no-wildcards 完全字符串匹配
--no-wildcards-match-slash wildcards do not match `/'
--wildcards 通配符批评 (default)
--wildcards-match-slash wildcards match `/' (default for exclusion)

注意

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
$ tar --version
tar (GNU tar) 1.26

$ ls
a1 a2 b1 b2
# -c创建tar包,-f指定tar包名称,一般使用.tar作为后缀,如下表示将a1和a2打包成a.tar
$ tar -c -f a.tar a1 a2
# 多个选项可以合并,但需要将-f选项放到最后,如下的-cf, -tvf
$ tar -cf b.tar b1 b2
$ ls
a1 a2 a.tar b1 b2 b.tar
# -t显示tar包中的文件列表
$ tar -tf a.tar
a1
a2
# -v显示详情
$ tar -tvf b.tar
-rw-r--r-- root/root 3 2021-10-18 23:38 b1
-rw-r--r-- root/root 4 2021-10-18 23:38 b2
# -A合并两个tar包,将后者合并到前者
$ tar -Af a.tar b.tar
$ tar -tf a.tar
a1
a2
b1
b2
$ echo aaa >> a1
# -d比较tar包中的文件和文件系统中的文件是否相同
$ tar -df a.tar
a1: Mod time differs
a1: Size differs
# -u追加变更的文件到tar包,多次执行也只追加一次
$ tar -uf a.tar a1
$ tar -uf a.tar a1
$ tar -tvf a.tar
-rw-r--r-- root/root 3 2021-10-19 00:05 a1
-rw-r--r-- root/root 4 2021-10-18 23:38 a2
-rw-r--r-- root/root 3 2021-10-19 00:05 b1
-rw-r--r-- root/root 4 2021-10-18 23:38 b2
-rw-r--r-- root/root 7 2021-10-19 00:06 a1
$ echo > a1
# -x解压tar包,如果tar包中有多个相同名称的文件,则最后一个文件会覆盖之前的文件
$ tar -xvf a.tar a1
a1
a1
$ more a1
aa
aaa
# -r追加文件到tar包,多次执行则多次追加
$ tar -rf a.tar a1
$ tar -rf a.tar a1
$ tar -tvf a.tar
-rw-r--r-- root/root 7 2021-10-19 00:06 a1
-rw-r--r-- root/root 4 2021-10-18 23:38 a2
-rw-r--r-- root/root 3 2021-10-19 00:05 b1
-rw-r--r-- root/root 4 2021-10-18 23:38 b2
-rw-r--r-- root/root 4 2021-10-19 00:09 a1
-rw-r--r-- root/root 4 2021-10-19 00:09 a1
-rw-r--r-- root/root 4 2021-10-19 00:09 a1
# -k解压时保留已存在的文件并提示
$ tar -kxf a.tar a2
tar: a2: Cannot open: File exists
tar: Exiting with failure status due to previous errors
$ rm b1
# --skip跳过已存在的文件
$ tar --skip-old-files -xvf b.tar
b1
b2
tar: b2: skipping existing file
$ ls
a.tar b1 b2 b.tar
# 指定压缩格式
$ ls
a1 a2 b1 b2
$ tar -zcf a.tar.gz a1 a2
$ tar -jcf a.tar.bz2 a1 a2
$ tar -Jcf a.tar.xz a1 a2
$ ls
a1 a2 a.tar.bz2 a.tar.gz a.tar.xz b1 b2
$ file a.tar*
a.tar.bz2: bzip2 compressed data, block size = 900k
a.tar.gz: gzip compressed data, from Unix, last modified: Tue Oct 19 09:20:35 2021
a.tar.xz: XZ compressed data
$ rm a.tar.*
$ ls
a1 a2 b1 b2
# -a根据文件名后缀自动判断压缩格式进行打包压缩
$ tar -acf a.tar.gz a1 a2
$ tar -acf a.tar.bz2 a1 a2
$ tar -acf a.tar.xz a1 a2
$ ls
a1 a2 a.tar.bz2 a.tar.gz a.tar.xz b1 b2
$ file a.tar*
a.tar.bz2: bzip2 compressed data, block size = 900k
a.tar.gz: gzip compressed data, from Unix, last modified: Tue Oct 19 09:23:01 2021
a.tar.xz: XZ compressed data
# --backup操作前先备份文件
$ echo cc > a1
$ tar --backup -xvf a.tar.gz
a1
Renaming `a1' to `a1~'
a2
Renaming `a2' to `a2~'
$ more a1
aa
$ more a1~
cc
# 指定备份文件的命名格式,numbered可保留多个备份
$ tar --backup=numbered -xvf a.tar.gz
$ ls
a1 a1~ a1.~1~ a1.~2~ a2 a2~ a2.~1~ a2.~2~ a.tar.bz2 a.tar.gz a.tar.xz b1 b2
# --suffix指定备份文件后缀,需配合simple参数使用
$ tar --backup=simple --suffix=.bak -xvf a.tar.gz
a1
Renaming `a1' to `a1.bak'
a2
Renaming `a2' to `a2.bak'
$ ls *.bak
a1.bak a2.bak
# -C指定解压缩目录
$ mkdir dir1
$ tar -zxf a.tar.gz -C dir1
$ ls dir1
a1 a2

$ ls
a1 a2 b1 b2
# 递归排除指定文件,如下递归排除所有*.bak,注意最后要加路径或*,*表示当前目录下的所有文件
$ tar -zcf data.tar.gz --exclude *.bak *
# 指定绝对路径,解压的时候会自动去除开头的/,然后递归创建子目录
$ tar -zcf data.tar.gz --exclude=/data/temp --exclude=/data/www/.git /data
# 不要指定相对路径,--exclude会递归查找所有目录,并排除所有同名子目录
# 如存在以下目录均会排除,temp, www/temp, www/web/temp等所有文件名为temp的均会排除
$ cd /data && tar -zcf data.tar.gz --exclude=temp --exclude=www/.git *
# 如需排除子目录建议配合 ls -I FILENAME 命令使用,或者使用如下的-T和-X选项
$ ls -I temp -I backup
# 注意ls命令默认不显示隐藏文件,如需显示隐藏文件加-A选项
$ ls -A -I temp -I .git
$ tar -zcf data.tar.gz $(ls -I temp -I backup)

# 排除文件和目录推荐使用-T和-X选项,不建议使用--exclude选项
$ cat include.txt
a1
a2
b1
# -T指定包含的文件列表
$ tar -T include.txt -cvf a.tar
a1
a2
b1
$ tar -tf a.tar
a1
a2
b1
$ cat exclude.txt
a1
a2
# -X指定排除的文件列表,注意最后需要加路径或*
$ tar -X exclude.txt -cvf b.tar *
a.tar
b1
b2
exclude.txt
include.txt
$ tar -tf b.tar
a.tar
b1
b2
exclude.txt
include.txt
$ ls
a1 a2 a.tar b1 b2 b.tar exclude.txt include.txt
# 支持通配符匹配,如下排除*.tar
$ cat exclude.txt
a1
a2
*.tar
$ tar -X exclude.txt -cvf c.tar *
b1
b2
exclude.txt
include.txt
$ tar -tf c.tar
b1
b2
exclude.txt
include.txt