Linux中的tar命令

在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۫ڶ>
஛䢫圁®xiE1dϴKꍙEþ으.*潼³ÿ߉*ÿڸ¸ga'efǢӒ̎³q3/䓦8g|;锽٬{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压缩文件

相关推荐
晚枫歌F2 小时前
同步异步阻塞非阻塞
运维·服务器
江湖有缘2 小时前
实时监控所有端口,Docker 部署 WatchYourPorts 保姆级教程
运维·docker·容器
Cyber4K2 小时前
【DevOps专项】Git 部署及使用方法
运维·git·devops
数据雕塑家2 小时前
Linux磁盘性能测试完全指南:使用FIO深入评估存储系统
linux·运维·服务器
csdn_aspnet2 小时前
告别重复造轮子:Codex写脚本,运维/DevOps场景下,用Codex批量生成Shell/Python自动化脚本
运维·python·ai·自动化·devops·codex·辅助编程
positive_zpc2 小时前
计算机网络——数据链路层(二)
服务器·网络·计算机网络
木心术12 小时前
DevOps全流程实践:从CI/CD到自动化测试的最佳实践
运维·ci/cd·devops
一直会游泳的小猫2 小时前
Homebrew - macOS 与 Linux 的包管理器
linux·运维·macos·brew·包管理工具
开开心心_Every2 小时前
文件强制删除工具,单文件拖入解锁删除简单
运维·edge·pdf·计算机外设·逻辑回归·散列表·启发式算法