4. tar 命令

tar 是 Linux/Unix 系统中用于 打包(归档) 和 压缩/解压 文件的命令。tar 命令可以将多个文件或文件夹打包成为一个单独的 .tar 文件,但并不压缩。

tar 命令可以使用选项结合其他压缩工具(如 gzip、bzip2、xz等)在归档的同时生成压缩归档文件(如 .tar.gz.tar.bz2.tar.xz等格式)。

tar 命令可以通过选项解压缩用 tar 命令归档的包,提取包内的数据文件。

命令格式:

tar [选项] [输出文件名] [输入文件/文件夹]

常用选项

选项
作用
-c
创建新的归档文件
-x
解压归档文件
-f <文件名>
指定归档文件名(必须放在最后)
-v
显示详细过程(verbose)
-z
使用 gzip 压缩/解压(.tar.gz.tgz
-j
使用 bzip2 压缩/解压(.tar.bz2
-J
使用 xz 压缩/解压(.tar.xz
-t
查看归档文件内容(不解压)
-r
向归档文件追加文件
-C 路径
解压到指定文件夹

示例:

使用 tar 命令将文件 hello.py 和 下载 文件夹打包为 .tar 文件。但并不压缩。

weimingze@mzstudio:~$ ls
hello.py  下载  公共  图片  文档  桌面  模板  视频  音乐
weimingze@mzstudio:~$ tar -cf myfiles.tar hello.py 下载/
weimingze@mzstudio:~$ ls
hello.py  myfiles.tar  下载  公共  图片  文档  桌面  模板  视频  音乐
weimingze@mzstudio:~$ ls -l myfiles.tar
-rw-rw-r-- 1 weimingze weimingze 583680 May 19 16:23 myfiles.tar

使用 tar命令将 文件 hello.py 和 下载 文件夹打包为 .tar.gz 文件。并使用 gzip 压缩。

weimingze@mzstudio:~$ ls
hello.py  myfiles.tar  下载  公共  图片  文档  桌面  模板  视频  音乐
weimingze@mzstudio:~$ tar -czf myfiles.tar.gz hello.py 下载/
weimingze@mzstudio:~$ ls
hello.py     myfiles.tar.gz  下载  图片  桌面  视频
myfiles.tar  公共  文档  模板  音乐
weimingze@mzstudio:~$ ls -l myfiles.tar.gz myfiles.tar
-rw-rw-r-- 1 weimingze weimingze 583680 May 19 16:23 myfiles.tar
-rw-rw-r-- 1 weimingze weimingze  40091 May 19 16:25 myfiles.tar.gz

从上述程序中可以看出 myfiles.tar.gz 要比 myfiles.tar 小很多。但是他们的内容是一样的。

使用 tar 命令将上述生成的 .tar.gz 文件解压缩到 桌面 文件夹下。

weimingze@mzstudio:~$ ls 桌面/
weimingze@mzstudio:~$ tar -xzf myfiles.tar.gz -C 桌面/
weimingze@mzstudio:~$ ls 桌面/
hello.py  下载

注意: 如果不写 -C 选项,则默认会将文件解压缩到当前文件夹。

下面我们尝试一下各种压缩算法

同上述打包一样,使用 tar 命令将 文件 hello.py 和 下载 文件夹打包为归档文件。

使用 xz 压缩为 .tar.xz

weimingze@mzstudio:~$ tar -cJf myfiles.tar.xz hello.py 下载/

使用 bzip2 压缩为 .tar.bz2

weimingze@mzstudio:~$ tar -cjf myfiles.tar.bz2 hello.py 下载/
/bin/sh: 1: bzip2: not found
tar: myfiles.tar.bz2: Cannot write: Broken pipe
tar: Child returned status 127
tar: Error is not recoverable: exiting now
weimingze@mzstudio:~$ sudo apt install bzip2
[sudo] password for weimingze:
weimingze@mzstudio:~$ sudo apt install bzip2
[sudo] weimingze 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
...  #  此处省略了安装过程。
weimingze@mzstudio:~$ tar -cjf myfiles.tar.bz2 hello.py 下载/
weimingze@mzstudio:~$ ls -l myfiles.tar myfiles.tar.gz myfiles.tar.bz2 myfiles.tar.xz
-rw-rw-r-- 1 weimingze weimingze 583680 May 19 16:23 myfiles.tar
-rw-rw-r-- 1 weimingze weimingze  25199 May 19 16:50 myfiles.tar.bz2
-rw-rw-r-- 1 weimingze weimingze  40091 May 19 16:25 myfiles.tar.gz
-rw-rw-r-- 1 weimingze weimingze  25032 May 19 16:39 myfiles.tar.xz
weimingze@mzstudio:~$ ls -l myfiles.tar*
-rw-rw-r-- 1 weimingze weimingze 583680 May 19 16:23 myfiles.tar
-rw-rw-r-- 1 weimingze weimingze  25199 May 19 16:50 myfiles.tar.bz2
-rw-rw-r-- 1 weimingze weimingze  40091 May 19 16:25 myfiles.tar.gz
-rw-rw-r-- 1 weimingze weimingze  25032 May 19 16:39 myfiles.tar.xz

此处会报告 bzip2 这个命令没有找到这样一个错误。如果你想尝试使用这个命令,需要你使用 sudo apt install bzip2 这个命令安装 bzip2 这个命令。Ubuntu 24.04 已经不再预安装这个高不成低不就 的 bzip2 命令了。

上述我们在使用 tar 命令打包是分别使用了 -z-j-J 压缩成了不同格式的文件。通过 ls -l 我们可以看出 没有压缩的 myfiles.tar 最大,使用 -J 选择压缩的 myfiles.tar.xz 文件最小。

在使用 tar 命令打包时如果打包使用了 -z 选项,那么解包时也必须使用 -z 选项。

.tar.xz 使用 xz 压缩算法压缩的文件。这是我目前看到的最优秀的无损压缩算法。现在 Linux 内核 普遍使用 xz 算法压缩。Linux 6.14.7 内核源码的压缩文件包 linux-6.14.7.tar.xz 才 149.5M 大小,解压缩后为 1622M,压缩比超过了 10比1。 超赞!

上述示例中 我在命令行中使用了 星号 * 号通配符,即 * 可以代表 0 或多个任意字母。所以 ls -l myfiles.tar*ls -l myfiles.tar myfiles.tar.gz myfiles.tar.bz2 myfiles.tar.xz 得到了相同的效果。

tar压缩格式对比

格式
命令选项
压缩率
速度
常见扩展名
不压缩
-cvf
最快
.tar
gzip
-czvf
中等
.tar.gz / .tgz
bzip2
-cjvf
较高
较慢
.tar.bz2
xz
-cJvf
最高
最慢
.tar.xz

练习:

  1. /etc/apt 文件夹复制到家文件夹 ~
  2. 使用 du 命令查看 ~/apt 文件夹的大小。
  3. ~/apt 文件使用 tar 命令打包为 apt.tar,然后查看打包后文件的大小。
  4. 使用 gzip 命令对 apt.tar 文件进行压缩并生成 apt.tar.gz
  5. 计算文件 apt.tar.gz 命令对 apt 文件夹的压缩率(压缩率 = (压缩后文件大小 / 原始文件大小) × 100%)。
  6. 删除压缩后的 apt.tar.gz 文件。