在Linux中,"打包"指的是将多个文件或目录合并成一个文件(如tar);"压缩"是指通过算法减小文件体积(如gzip等)
最常用的工具是tar,它能同时完成打包个压缩
tar的英文全称:tape archiver,即磁带归档器
核心功能:
将多个文件或目录打包成一个文件(称为archive),默认是不会压缩的,但可以配合压缩工具使用
语法:
bash
tar [选项] [归档文件名] [要打包的文件/目录]
常用选项解释:
主要操作模式(必须选一个)
| 选项 | 英文含义 | 说明 |
|---|---|---|
-c |
create | 创建归档文件(打包) |
-x |
extract | 解包归档文件 |
-t |
table of contents | 列出归档文件内容(不实际解压) |
-r |
replace | 向已有归档文件追加文件 |
-u |
update | 仅追加比归档中更新的文件 |
-A |
Append | 将一个归档文件附加到另一个归档末尾 |
-d |
diff | 比较归档与文件系统的差异 |
--delete |
- | 从归档中删除文件 |
压缩选项:
| 选项 | 压缩工具 | 生成扩展名 | 特点 |
|---|---|---|---|
-z |
gzip | .tar.gz / .tgz |
速度快,压缩率中等,最常用 |
-j |
bzip2 | .tar.bz2 / .tbz2 |
速度较慢,压缩率更高 |
-J |
xz | .tar.xz / .txz |
速度最慢,压缩率最高 |
--lzma |
lzma | .tar.lzma |
类似 xz(旧格式) |
--zstd |
zstd | .tar.zst |
压缩率与速度平衡(较新) |
辅助选项:
| 选项 | 英文含义 | 说明 |
|---|---|---|
-f |
file | 指定归档文件名(必须放在选项最后,后接文件名) |
-v |
verbose | 显示处理的文件列表 |
-C |
Change directory | 解压/打包前切换到指定目录 |
-p |
preserve permissions | 保留文件权限(解压时默认对 root 有效) |
--exclude |
- | 排除匹配的文件/目录 |
--exclude-from |
- | 从文件中读取排除列表 |
--wildcards |
- | 支持通配符匹配 |
-P |
Absolute Paths | 保留绝对路径(通常不推荐,有安全风险) |
--strip-components=N |
- | 解压时移除前 N 层目录 |
注:tar的f选项后面只能是文件不能是目录,f,顾名思义是file,文件(归档文件),不是目录directory
- 打包时:后面的归档文件可以不存在,tar会自动创建这个文件
- 解包时:后面的归档文件必须存在,否则报错
bash
[root@master ~]# cd /tmp
[root@master tmp]# ls
hsperfdata_root test1 vmware-root_656-2689274927 vmware-root_659-4013788787 vmware-root_663-4022243318
systemd-private-5854d42a467a4b06ae78cd0f4be30b1e-ntpd.service-kSfrnq vmware-root_653-4013264490 vmware-root_657-4022112241 vmware-root_660-2697467306 vmware-root_664-2722697761
test vmware-root_655-4021587944 vmware-root_658-2697598381 vmware-root_662-2689143848 vmware-root_665-3988687359
[root@master tmp]# ls test # 查看test目录下的文件和子目录
error.log ls-output.txt output.txt test1 test.txt time.log
[root@master tmp]# tar -cf ./test1/archive.tar ./test # 将test目录下的所有文件和目录都打包进test1目录下的archive.tar文件中
[root@master tmp]# ls ./test1
archive.tar
[root@master tmp]# mkdir test3
[root@master tmp]# tar -xf test1/archive.tar -C test3 # 解包在test3目录中
[root@master tmp]# ls test3
test
[root@master tmp]# ls test3/test
error.log ls-output.txt output.txt test1 test.txt time.log
[root@master tmp]# tar -xf test1/archive.tar -C test1 # 解包在test1目录中
[root@master tmp]# ls test1
archive.tar test
[root@master tmp]# ls test1/test
error.log ls-output.txt output.txt test1 test.txt time.log
打包的好处:
- 便于传输和分享
- 保持文件结构完整(打包解压后,完整的目录结构会被保留)
- 保留文件元数据(如文件权限、所有者/所有组、时间戳(修改时间,访问时间)、软链接关系、硬链接关系)
- 便于压缩:打包后才能有效压缩
- 便于备份和恢复
bash
[root@master tmp]# tar -zf archive.tar.gz test1/archive.tar
tar: You must specify one of the `-Acdtrux' or `--test-label' options
Try `tar --help' or `tar --usage' for more information.
[root@master tmp]# ls test1
archive.tar test
[root@master tmp]# tar -czf archive.tar.gz test1/archive.tar
[root@master tmp]# ls
archive.tar.gz test vmware-root_653-4013264490 vmware-root_657-4022112241 vmware-root_660-2697467306 vmware-root_664-2722697761
hsperfdata_root test1 vmware-root_655-4021587944 vmware-root_658-2697598381 vmware-root_662-2689143848 vmware-root_665-3988687359
systemd-private-5854d42a467a4b06ae78cd0f4be30b1e-ntpd.service-kSfrnq test3 vmware-root_656-2689274927 vmware-root_659-4013788787 vmware-root_663-4022243318
[root@master tmp]# ls -l archive.tar.gz
-rw-r--r--. 1 root root 566 Apr 22 11:35 archive.tar.gz
[root@master tmp]# cat archive.tar.gz B秃o1DZ껥JbﷄÄB¥͑⒓.q五
#¨H,]:12P暖·/JhԊ!*ַ³ܝlǾ敦(U§軃혴˞
¶OzIͯޝk<¿W±Jµ
%.Lþw#/º¢ݩz SÿH¥҈B{i!gm¹®ߦþЩuª←ÿ£þrµþI¬¤I ᙧµ@憋N̉´l'ε䴨¿N琟ɿ¼0ynšu⏳®-ԎǘÿTI]ꔿ]84?Ղɮם蹾選µ8i۫ڶ>
䢫圁®xiE1dϴKꍙEþ으.*潼³ÿ߉*ÿڸ¸ga'efǢӒ̎³q3/䓦8g|;锽٬{n¹ÿ7E]꿟杖ϳ'®.¿ώ/g࠼þ⻬㻋꼙>>o¿~~ºⴹF܈rxVਚc}þu´붒2.~ᗗ[root@master tmp]
上面第一次使用选项参数z进行压缩时出现了错误,这是因为你没有指定tar命令的主要操作参数,因此tar命令就不知道你是想-c创建归档文件还是想-x解压归档文件,或是想-t列出归档文件......
第二次使用参数-czf表明要利用gzip工具来创建一个.gz文件,文件名称就是f后面跟的archive.tar.gz
注:.gz是gzip压缩文件的扩展名。是一种单一的压缩文件格式
.gz文件是二进制文件,cat命令会将二进制文件中的内容原样输出到终端,而终端期望接受文本(ASCII或UTF-8编码的字符),因此会产生冲突
| 想做什么 | 命令 |
|---|---|
查看 .gz 文件内容 |
zcat file.gz |
查看 .bz2 文件内容 |
bzcat file.bz2 |
查看 .xz 文件内容 |
xzcat file.xz |
查看 .tar 文件列表 |
tar -tf file.tar |
查看 .tar.gz 文件列表 |
tar -tzf file.tar.gz |
查看 .tar.gz 中某文件内容 |
tar -xzf file.tar.gz -O filename |
| 检查文件类型 | file filename |
| 恢复乱码终端 | reset |
bash
[root@master tmp]# gunzip archive.tar.gz # 解压.gz文件并会删除.gz文件
[root@master tmp]# ls
archive.tar test vmware-root_653-4013264490 vmware-root_657-4022112241 vmware-root_660-2697467306 vmware-root_664-2722697761
hsperfdata_root test1 vmware-root_655-4021587944 vmware-root_658-2697598381 vmware-root_662-2689143848 vmware-root_665-3988687359
systemd-private-5854d42a467a4b06ae78cd0f4be30b1e-ntpd.service-kSfrnq test3 vmware-root_656-2689274927 vmware-root_659-4013788787 vmware-root_663-4022243318
可以看到原先/tmp目录下的archive.tar.gz文件被解压成了.tar文件,原.gz文件被删除了
bash
[root@master tmp]# gzip -d archive.tar.gz
[root@master tmp]# ls
archive.tar test vmware-root_653-4013264490 vmware-root_657-4022112241 vmware-root_660-2697467306 vmware-root_664-2722697761
hsperfdata_root test1 vmware-root_655-4021587944 vmware-root_658-2697598381 vmware-root_662-2689143848 vmware-root_665-3988687359
systemd-private-5854d42a467a4b06ae78cd0f4be30b1e-ntpd.service-kSfrnq test3 vmware-root_656-2689274927 vmware-root_659-4013788787 vmware-root_663-4022243318 z
bash
[root@master tmp]# tar -czf archive.tar.gz archive.tar
[root@master tmp]# ls
archive.tar test vmware-root_655-4021587944 vmware-root_659-4013788787 vmware-root_664-2722697761
archive.tar.gz test1 vmware-root_656-2689274927 vmware-root_660-2697467306 vmware-root_665-3988687359
hsperfdata_root test3 vmware-root_657-4022112241 vmware-root_662-2689143848 z
systemd-private-5854d42a467a4b06ae78cd0f4be30b1e-ntpd.service-kSfrnq vmware-root_653-4013264490 vmware-root_658-2697598381 vmware-root_663-4022243318
[root@master tmp]# rm archive.tar
rm: remove regular file 'archive.tar'? y
[root@master tmp]# ls
archive.tar.gz test vmware-root_653-4013264490 vmware-root_657-4022112241 vmware-root_660-2697467306 vmware-root_664-2722697761
hsperfdata_root test1 vmware-root_655-4021587944 vmware-root_658-2697598381 vmware-root_662-2689143848 vmware-root_665-3988687359
systemd-private-5854d42a467a4b06ae78cd0f4be30b1e-ntpd.service-kSfrnq test3 vmware-root_656-2689274927 vmware-root_659-4013788787 vmware-root_663-4022243318 z
gzip -d 和gunzip的效果一样,-d表示decompress,compress的意思是压紧、压缩,decompress的意思是减压、解压缩
bash
[root@master tmp]# tar -czf archive.tar.gz archive.tar
[root@master tmp]# ls
archive.tar test vmware-root_655-4021587944 vmware-root_659-4013788787 vmware-root_664-2722697761
archive.tar.gz test1 vmware-root_656-2689274927 vmware-root_660-2697467306 vmware-root_665-3988687359
hsperfdata_root test3 vmware-root_657-4022112241 vmware-root_662-2689143848 z
systemd-private-5854d42a467a4b06ae78cd0f4be30b1e-ntpd.service-kSfrnq vmware-root_653-4013264490 vmware-root_658-2697598381 vmware-root_663-4022243318
[root@master tmp]# rm archive.tar
rm: remove regular file 'archive.tar'? y
[root@master tmp]# ls
archive.tar.gz test vmware-root_653-4013264490 vmware-root_657-4022112241 vmware-root_660-2697467306 vmware-root_664-2722697761
hsperfdata_root test1 vmware-root_655-4021587944 vmware-root_658-2697598381 vmware-root_662-2689143848 vmware-root_665-3988687359
systemd-private-5854d42a467a4b06ae78cd0f4be30b1e-ntpd.service-kSfrnq test3 vmware-root_656-2689274927 vmware-root_659-4013788787 vmware-root_663-4022243318 z
bash
[root@master tmp]# gzip --version
gzip 1.5
Copyright (C) 2007, 2010, 2011 Free Software Foundation, Inc.
Copyright (C) 1993 Jean-loup Gailly.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Written by Jean-loup Gailly.
输入gzip --version查看gzip命令的版本,版本号小于1.6则不支持-k参数
本来可以用gizp -d -k archive.tar.gz来解压.gz文件并不会删除.gz文件
bash
[root@master tmp]# tar -xzf archive.tar.gz
[root@master tmp]# ls
archive.tar test vmware-root_655-4021587944 vmware-root_659-4013788787 vmware-root_664-2722697761
archive.tar.gz test1 vmware-root_656-2689274927 vmware-root_660-2697467306 vmware-root_665-3988687359
hsperfdata_root test3 vmware-root_657-4022112241 vmware-root_662-2689143848 z
systemd-private-5854d42a467a4b06ae78cd0f4be30b1e-ntpd.service-kSfrnq vmware-root_653-4013264490 vmware-root_658-2697598381 vmware-root_663-4022243318
文件后缀名是.tar.gz,说明是打包后再压缩的,解压时就可以用tar命令来处理。并且会保留原.gz压缩文件