Linux系统中,文件/目录归档和压缩是两个不同但又经常被一起使用的概念,它们的工作原理和作用完全不同,本文将帮助你建立文件归档和压缩的定义、用途,厘清常用但易混淆的Linux小知识。
什么是文件归档
归档,Archiving,是把多个文件或目录打包成合并成一个整体,通常称为tarball,占用硬盘的总空间不变。它通常保留了文件的结构、权限、属主和时间戳等Meta元数据。
归档的目的是方便存储、备份和传输,它并不在意文件大小,文件归档前和归档后的大小几乎不变。
Linux系统中典型的归档工具是 tar(Tape Archiver的缩写)。
什么是文件压缩
压缩,Compression,是通过不同算法来减少文件占用的硬盘空间,压缩后的文件因算法不同会自动形成不同的文件后缀名,如.tar.gz、.tar.bz2、.tar.xz、.tar.zst、.zip、.rar、7z等等。
压缩的目的是为了节省存储空间和加快文件传输,节省传输时间,它并不关心和保留文件的元数据。
值得注意的是,Linux系统中常用的压缩工具一般只能压缩单个文件流,这也是为什么在需要压缩多个文件或目录时一般会联合tar归档工具一起使用的底层原因。
Linux系统中典型的压缩工具是gzip、bzip2、xz,其他常见的压缩工具还有7zip、rar、Zstandard(zstd)等(需要手动安装)。
tar命令详解
大多数使用场景都是对多个文件/目录进行批量操作,这需要先进行文件归档,再进行文件压缩。
一个典型的文件归档压缩处理逻辑是:
c(创建)→ j(bzip2压缩)→ v(显示详情)→ f(指定文件名)
tar -czvf file.tar.gz /path/to/files
tar命令核心选项有:
-c,–create 创建,创建新的归档文件;
-x,–extract 提取,解压/解包归档文件;
-t,–list 列表,查看归档文件中的内容列表;
-r,–append 追加,向已存在的归档文件末尾添加文件;
-u,–update 更新,只追加比归档中更新的文件; # 类似替换的效果
-d,–diff 比较,比较归档与文件系统中的差异。
压缩算法选项:
-z,–gzip 通过gzip压缩,自动生成.tar.gz或.tgz后缀文件;
-j,–bzip2 通过bzip2压缩,自动生成.tar.bz2或.tbz2后缀文件;
-J,–xz 通过xz压缩,自动生成.tar.xz后缀文件;
–lzma 通过LZMA压缩,自动生成.tar.lzma后缀文件;
–zstd 通过Zstandard压缩,自动生成.tar.zst后缀文件。
其他常见辅助选项:
-v,–verbose 详细输出,显示正在处理的文件列表;
-f,–file 文件,制定归档文件名(选项后必须紧跟文件名);
-C,–directory 目录,切换到指定目录进行操作; #指定解压目录等
-p,–permissions 保留权限,保留原始文件权限属性;
-P,–absolute-names 绝对路径,保留文件名前的绝对路径; #慎用
–exclude 排除,排除指定文件或目录。
归档压缩联合使用
- 对指定目录下所有文件进行归档压缩:
tar -czvf file.tar.gz /path/to/files#czvf=create+gzip+verbose+file - 对压缩文件进行解压解包:
tar -xzvf file.tar.gz [-C /target/to/unzips]#xzvf=extract+gzip+verbose+file -C 指定解压到什么路径 - 查看归档文件内文件列表信息:
tar -tf file.tar.gz
扩展
一个有趣的现象,不知道你发现没有:
按照逻辑顺序,在对一个压缩包进行解压解包操作时,理论上应该是先解压 -z,后解包 -x,但为什么常规写法是tar -xzvf 而不是tar -zxvf呢?
这里面涉及到几条的Unix哲学思想:一是单一职责原则,tar工具专注于归档(打包/解包/查看包内容),gzip专注于压缩/解压;二是接口一致性原则,Unix推崇“以工具为主语,以核心功能为第一参数”,tar命令的核心功能放在第一位,让人一眼就知道“执行这条命令的目的是什么”。
所以,基于以上原则,假如gzip命令也支持文件归档(打包/解包),那么在使用gzip命令时,推荐的gzip命令选项使用顺序应当是:
gzip -解压 -tar解包 -显示详情 -文件 file.tar.gz而 tar 推荐的选项顺序是:tar -解包 -gzip压缩 -显示详情 -文件 file.tar.gz

