一、常见压缩档

压缩格式 特点
*.zip zip 程序压缩打包的档案; (很常见,但是因为不包含文档名编码信息,跨平台可能会乱码)
*.rar rar 程序压缩打包的档案;(在windows上很常见,但是是商业软件。)
*.gz gzip 程序压缩的档案; (linux目前使用最广泛的压缩格式)
*.bz2 bzip2 程序压缩的档案;
*.xz xz 程序压缩的档案;
*.tar tar 程序打包的资料,并没有压缩过;
*.tar.gz tar 程序打包的档案,其中并且经过 gzip 的压缩 (最常见)
*.tar.bz2 tar 程序打包的档案,其中并且经过 bzip2 的压缩
*.tar.xz tar 程序打包的档案,其中并且经过 xz 的压缩 (新一代压缩选择)
*.7z 7zip 程序压缩打包的档案。

目前最常见的是 tar.gz tar.xz tar.7z 这三种格式。

二、能否压缩多文档分类

  1. gzip bzip2 xz 这三个压缩格式都只能压缩单个文档。(换而言之,该进程的输入输出都是流,不包含文档树信息。)
    因此如果要用它们压缩多个文档或目录,需要使用另一个软件来先将要压缩的文档打包成一个文档(包含文档树信息),这个命令就是 tar.
    先使用 tar 归档要压缩的多文档,再对生成的 *.tar 使用 上述压缩指令(或者直接使用管道重定向),Linux 下是这样实现多文档压缩的。

  2. 7zzip,以及 rar 格式,都同时具有了 归档(tar) 和 压缩 两个功能,(即该格式包含了文档树信息)也就是说它们可以直接压缩多个文档。


三、各格式使用的算法差别

  1. gzip 成熟的格式,使用的算法基于 DEFLATE。(压缩比适中)
  2. 7z 新一代格式,使用的压缩算法可替换,默认是使用的 lzma/lzma2 算法,使用 AES-256 作为加密算法。
  3. xz 同样使用的 lzma/lzma2 算法,不过只能压缩一个文档。(压缩比很高,相对的用时也更多)
  4. zip 同样是支持多种算法的压缩格式,默认应该是使用的 DEFLATE 算法。诞生较早,有很多缺陷。(跨平台乱码、容易被破解等)
  5. rar 使用 类DEFLATE 的专有算法,使用 AES 加密。(rar5.0 以后使用 AES-256CBC)

不过 zip 被广泛应用在安卓的 apk 格式、javajar、电子书的 epub,还有 github、云硬盘的多文档下载中,原因嘛大概是 zip 很流行,所以不用担心目标平台没解压软件吧。


四、如何选用压缩方案

  1. tar.gz 在 linux 上最常见,在压缩率和压缩时间上拥有良好的平衡。如果有任何疑惑,就选用它吧,不会错。
  2. tar.xz 是新一代的压缩格式,虽然拥有更好的压缩率,压缩/解压速度相对要慢很多倍。一般在电脑性能足够好的时候,可选用它。
  3. 7zxz 同为新一代压缩格式,它更复杂,支持多文档压缩。而且更适合跨平台,推荐使用。
  4. zip 因为跨平台容易导致文档名乱码,不建议使用。(虽然有这样的缺陷,但是却意外的用得很广泛,在前一节有说过)
  5. rar 性能不差,但是是商业格式,不开源,不建议使用。(做得比较好的是它的 recovery records,在网络环境不好,容易导致包损坏时,这个功能就特别棒)
  6. tar.bz2 算是 linux 压缩历史上,过渡时期的产物,性能也介于 gzxz 之间,一般来说不需要考虑它。

五、Linux 上的压缩相关指令

1. tar 指令

通过之前的介绍,可以看出常用的就是 tar gzip xz 等,如果要压缩多个文档,需要先使用 tar,再用管道重定向到 gzipxz,比较麻烦,而这几个指令又很常用。于是后来对 tar 做了增强。

tar 最初只是一个归档进程,而压缩则由其他的压缩软件来完成(一个进程只干一件事)。后来为了方便,丧心病狂地集成了各种压缩指令。因此这里就只介绍这一个命令了(它囊括了所有)。

tar 的选项与参数非常的多!我们只讲几个常用的选项,更多选项可以自行 man tar 查询!

[dmtsai@study ~]$ tar [-z|-j|-J] [cv] [-f 待创建的新档名] filename... <==打包与压缩
[dmtsai@study ~]$ tar [-z|-j|-J] [tv] [-f 既有的 tar 档名]           <==察看档名
[dmtsai@study ~]$ tar [-z|-j|-J] [xv] [-f 既有的 tar 档名] [-C 目录]  <==解压缩

常用选项与参数:

-c  :创建打包档案,可搭配 -v 来察看过程中被打包的档名(filename),c 为 create
-t  :查看打包档案的内容含有哪些档名,重点在查看『档名』,t 为 list
-x  :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开,x 为 extract
      注意:-c, -t, -x 不可同时出现在一串指令列中
-z  :透过 gzip  的支持进行压缩/解压缩:此时档名最好为 *.tar.gz
-j  :透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2
-J  :透过 xz    的支持进行压缩/解压缩:此时档名最好为 *.tar.xz
      注意:-z, -j, -J 不可以同时出现在一串指令列中
-v  :在压缩/解压缩的过程中,将正在处理的档名显示出来,v 为 verbose
-f  :-f 后面要立刻接要被处理的档名!建议 -f 单独写一个选项!(比较不会忘记), f 为 filename
-C  :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项
-p  :保留备份资料的原本权限与属性,常用于备份 (-c) 重要的设定档
-P  :保留绝对路径,亦即允许备份资料中含有根目录存在之意
--exclude=FILE:在压缩的过程中,不要将 FILE 打包

详细参数如下所示:


tar [options] -f archive.tar [files...]

-f archive.tar:指定归档文件的名称。
[files...]:要打包的文件和目录。

options 参数

基本操作选项
-c:创建一个新的归档文件。
-x:解压归档文件。
-t:列出归档文件的内容。
-r:向现有归档文件中追加文件。
-u:仅追加比归档文件中已有文件更新的文件。
-d:找到归档文件中与文件系统不同步的差异。
-A:将一个 .tar 文件追加到另一个 .tar 文件中。

文件选择和排除
-f <file>:指定归档文件的名称(必须放在选项列表的最后)。
-C <directory>:切换到指定目录进行操作。
--exclude=<pattern>:排除匹配指定模式的文件。
--exclude-from=<file>:从指定文件读取要排除的模式。
--exclude-caches:排除目录中的缓存文件。
--exclude-backups:排除以 ~ 结尾的备份文件。
--exclude-vcs:排除版本控制系统生成的文件(如 .git、.svn 等)。

压缩和解压选项
-z:使用 gzip 压缩归档文件。
-j:使用 bzip2 压缩归档文件。
-J:使用 xz 压缩归档文件。
--lzip:使用 lzip 压缩归档文件。
--lzma:使用 lzma 压缩归档文件。
--lzop:使用 lzop 压缩归档文件。
--zstd:使用 zstd 压缩归档文件。
-a:自动选择压缩方式(基于归档文件的扩展名,如 .tar.gz、.tar.bz2 等)。
-I <command>:使用指定的压缩程序进行压缩或解压。

输出和交互选项
-v:显示详细操作过程(verbose)。
--progress:显示进度条(与 -v 一起使用时)。
-w 或 --interactive:在每次操作前询问用户确认。
--checkpoint:在处理每个文件后显示一个检查点。
--checkpoint-action=<action>:在检查点执行指定的动作,如 echo、dot 等。
--totals:在操作结束后显示处理的总字节数。
--verbose:详细显示处理的信息。
--quiet:尽可能少的输出信息。

文件和权限相关选项
-p:保留文件的原始权限(解压时)。
--same-owner:尝试将解压的文件设为原始所有者(需超级用户权限)。
--no-same-owner:不设置文件所有者。
--same-permissions:保留文件的原始权限(与 -p 相同)。
--no-same-permissions:不保留原始权限,使用当前用户的 umask 设置权限。
-m:在解压时不恢复文件的修改时间,而使用当前时间。

归档管理选项
-k 或 --keep-old-files:解压时保留已有文件,不覆盖。
--overwrite:解压时强制覆盖已有文件。
--remove-files:归档成功后删除原始文件。
--delete:从归档文件中删除指定文件(仅限 gnu tar)。
--keep-newer-files:解压时保留比归档中较新的文件。
--listed-incremental=<file>:创建增量备份或从增量备份恢复。

文件系统和设备选项
-L <N>:分割大于 N 字节的归档文件(对于磁带机)。
--tape-length=<number>:指定磁带长度(对于磁带机)。
--multi-volume:创建或恢复多卷归档文件。
-M:与 --multi-volume 一起使用,处理多卷归档文件。
--use-compress-program=<prog>:使用指定的压缩程序。

其他实用选项
--transform=<expression>:重命名归档中的文件。
--strip-components=<number>:解压时剥离指定数量的路径组件。
--ignore-failed-read:忽略读取错误并继续操作。
--occurrence=<number>:在归档中选择第 number 个出现的文件。
-S:处理稀疏文件(仅归档实际使用的块)。
--no-recursion:不递归进入目录。
-h 或 --dereference:归档符号链接指向的文件而非链接本身。

帮助和版本信息
--help:显示帮助信息。
--version:显示 tar 的版本信息。

tar 最常用的命令:

压 缩:tar -zcv -f filename.tar.gz <压缩的档案或目录名称>
查看文档树:tar -ztv -f filename.tar.gz
解压缩:tar -zxv -f filename.tar.gz -C <解压缩的目录>

上面的命令需要根据压缩格式的不同,选用 -z -j -J 选项,而实际上文档的后缀就已经表明了它的压缩格式,不免让人觉得多余。

因此,通用的压缩/解压项为:

-a, --auto-compress
              Use archive suffix to determine the compression program.

通用的解压命令为:

tar -axv -f file.tar.* (它适用于上述三种压缩格式)

仅解压指定的文档:

  1. 先查看文档树找到需要解压的文档的文档名
  2. tar -zxv -f 打包档 .tar.gz 待解开档名

打包某目录,但不含该目录下的某些档案:

tar -zcv -f filename.tar.gz directory --exclude=FILE1 --exclude=func*

使用 --exclude=FILE 选项(支持文档名的模式匹配,而且可重复)
注意:在指定排除目录的时候,目录的话结尾不能带/否则将会排除失败

只打包目录中比指定时刻更新的文档:

使用 --newer-mtime="2025/03/07" 选项。

2. zip 格式(linux 一般也会自带,详细的请 man

  1. 压缩命令:zip
  • 压缩目录:zip -r filename.zip directory
    • -r 表示递归压缩,压缩包会包含这个目录
  1. 解压命令:unzip
  • 解压到某目录:unzip -d directory filename.zip (-d dir 表示将内容解压到dir目录内)
    • -t 测试压缩档的完整性
    • -x filename 排除某文档

3. 7z 格式(需要 p7zip,deepin 自带,更多的请 man

  1. 查看目录树:7z l file.7z (List contents of archive)
  2. 压缩:7z a file.7z file1 directory1 (a 为创建压缩档或向压缩档中添加文档/目录,一次可指定多个要压缩的文档或目录)
  3. 解压:7z x file.7z -o directory (解压到指定目录)
  4. 测试完整性:7z t file.7z

p7zip 安装好后,会提供 7z7za7zr 三个指令,一般来说直接用 7z 就行。

注意: 7z 不会保存 Linux 文档的用户、用户组信息,因此不能直接用于 Linux 系统备份,此时建议用 tar.xztar.7z(也就是先用 tar 打包)

4. rar 格式(还是那句话,更多的请 man

rar 是非开源的格式,Linux 默认是不会包含 rar 压缩软件的,但是它的解压软件是开源的,deepin 自带 unrar,顺便 7zip 也可解压 rar 文档。

若想用 linux 创建 rar 压缩档,需要从 rarlab 上下载 Linux 版,(deepin源自带)不过要注意的是该 linux 版是 40 天试用版,要长期使用的话,可能需要破解。(rar 的 key 网上一搜一大把)

  1. 压缩:rar a file.rar file (这个是试用的)
  2. 解压:unrar x file.rar (这个开源免费)