内容纲要

🗂 本文目录:Linux >


在 Windows 上处理归档文件一般都是用一个应用比如 BandZip 处理压缩和解压缩。

但其实归档文件有归档和压缩的分别,Unix 有一个理念是「一个工具只做一件事」。所以在面对多个文件需要归档一起时使用「打包」,在「打包」后想对文件体积进行处理时使用「压缩」。

其中处理「打包」的应用一般为「tar」。而处理「压缩」的应用一般为「gzip」或者「bzip2」。一般「tar」文件代表的是打包好但是没压缩的文件,而打包好且压缩的文件采用双后缀名格式如「.tar.gz」、「.tar.bz2」。

打包

$ tar 参数 归档文件名及路径 被归档文件1 被归档文件2

假设想把当前目录下的 README.md 打包到当前目录下并命名成 MD.tar

  • -c 表示创建一个打包文件
  • -f 表示目标文件名
$ tar -cf MD.tar README.md

打包绝对路径时的提示

在压缩打包绝对路径的包的时候可能会遇到一个报错:

tar: Removing leading `/' from member names

这时候可以使用 -P 参数,且注意这个参数需要在 -f 之前,如:tar -cPf

举个例子,假设想把 /etc 这个目录打包到主目录下,命名为 bak.tar

$ sudo tar -cPf /home/conners/bak.tar /etc

添加新文件到归档文件中

例如,将当前目录下的文件 cron.conf 添加到当前目录下已有的归档文件 bak.tar

# 使用 -r 参数追加文件
$ tar -rf music.tar demo.mp3

查看归档文件中的内容

  • 使用 -t 参数查看归档文件中的内容
  • 可再加上 -v 参数查看如时间、权限、属主等详细内容
# 使用 -t 查看归档文件中的内容
$ tar -tf test.tar

# 使用 -v 查看详细信息
$ tar -tvf test.tar

压缩

在打包完成后可以分别使用 gzip 或 bzip2 进行压缩。但其实 tar 已经集成了这个功能,可以在打包的时候连带压缩。

gzip 压缩

gzip 压缩使用 -z 参数,注意文件名要加上双后缀名

$ sudo tar -czPf /home/conners/bak.tar.gz /etc

bzip2 压缩

bzip2 压缩使用 -j 参数,注意文件名要加上双后缀名

$ sudo tar -cjPf /home/conners/bak.tar.bz2 /etc

压缩完成后来看看两者和为压缩的打包文件的体积对比

$ ls -lh

返回:

total 4.5M
-rw-r–r– 1 root root 3.3M Aug 13 10:01 bak.tar
-rw-r–r– 1 root root 591K Aug 13 10:03 bak.tar.bz2
-rw-r–r– 1 root root 637K Aug 13 10:03 bak.tar.gz

从结果来看:

  • 「.tar」因为仅仅是打包文件所以体积较大
  • 「.tar.bz2」体积最小但是耗时比体积稍大的「.tar.gz」要长。

解压

有压缩就有解压缩,解压使用 -x

# 在当前目录中解压 bak.tar
$ tar -xf bak.tar
# 在当前目录中解压 bak.tar.gz
$ tar -xzf bak.tar.gz
# 在当前目录中解压 bak.tar.bz2
$ tar -xjf bak.tar.bz2

# 当然还可以指定解压到的目录
# 在当前目录创建一个名为 bak 的文件夹
$ mkdir bak
# 使用 -C 参数(注意是大写)指定目录
$ tar -xzf bak.tar.gz -C ./bak

同样算法但不同后缀名

其实为了简化和传播, gzip 和 bzip2 还有单后缀名格式。如下:

.tar.gz > .tgz
.tar.bz2 > .tbz2

更智能的 -a 参数

对于 gzip 的 -z 参数和 bzip2 的 -j 参数,其参数名和自身程序名没有太大关联,让人觉得不直观不好记。

幸好有一个 -a (auto)参数可以智能的根据后缀名自动处理。

提示:

  • -f 表示目标文件名
  • -c 表示创建一个打包文件
  • -x 表示提取一个打包文件
# 压缩 gzip
$ tar -caf <归档文件名.>{tar.gz|tgz} <被归档文件> ...

# 压缩 bzip2
$ tar -caf <归档文件名>.{tar.bz2|tbz2} <被归档文件> ...

# 解压
$ tar -xaf <归档文件名>

延伸