compress & archive


  • 打包(archive):把多个文件合成一个文件(不减小体积)
  • 压缩(compress):用算法缩小体积

在Linux中最经典的组合就是:tar打包,gzip/bzip2/xz压缩工具

xxx.tar.gz
xxx.tar.bz2
xxx.tar.xz

意思是:先tar打包,再用不同算法压缩

常用压缩格式及工具

.gz

  • 工具:gzip
  • 特点:速度快,压缩率中等
  • 几乎所有服务器都默认支持
  • 底层:LZ77 + Huffman
# 压缩
gizp file.txt

# 解压
gzip -d file.txt.gz
# 或
gunzip file.txt.gz

# 查看压缩文件内容
zcat filename.gz

.bz2

  • 工具:bzip2
  • 特点:压缩率比gzip高,但慢
  • 底层:Burrows-Wheeler
# 压缩
bzip2 filename
bzip2 -9 filename # 最大压缩率

# 解压缩
bunzip2 filename.bz2
bzip2 -d filename.bz2

# 查看内容
bzcat filename.bz2

.xz

  • 工具:xz
  • 特点:压缩率最高,但最慢
  • 内核源码、发行版常用
  • 底层:LZMA2
# 压缩
xz filename
xz -9 filename # 最大压缩率

# 解压缩
unxz filename.xz
xz -d filename.xz

# 查看内容
xzcat filename.xz

.zip

  • Windows/Linux通用
  • 特点:跨平台兼容性好
# 压缩
zip archive.zip file1 file2 dir1
zip -r archive.zip directory/ # 递归压缩目录

# 解压
unzip archive.zip
unzip -l archive.zip # 查看内容
unzip -d target_dir archive.zip # 解压到指定目录

zip可以同时打包和压缩目录,但在Linux生态中会导致丢失关键信息:

  • 文件权限被修改(丢失原始权限)
  • 所有者信息破坏
  • 硬链接被破坏

其他压缩工具

需要安装

  • 7z(.7z):压缩率很高
  • Zstandard(.zst)

归档工具tar

tar主要用途是将多个文件/目录打包成一个文件

1979年,tar在Unix V7中引入,用于磁带备份

既然有gzip, xz等压缩工具,为什么还需要tar

核心原因:压缩工具不擅长处理目录,gzip, xz, bzip2等压缩文件只能压缩单个文件,不能直接压缩目录

# 这些命令会报错或只处理单个文件
gzip myfolder/
gzip: myfolder/ is a directory -- ignored

xz myfolder/
xz: myfolder/: Is a directory, skipping

tar的作用:打包 + 保留元数据

tar = Tape ARchive(磁带归档),最初设计用于磁带备份。它的核心功能是

  1. 将多个文件/目录合并成单个文件流
  2. 保留文件元数据(权限、所有者、时间戳、目录结构)
  3. 支持追加、增量备份等操作
# 压缩一个目录下的所有文件(每个文件独立压缩),不能包含文件夹
$ xz folder/*
$ ls folder/
file1.txt.xz file2.txt.xz

# 解压时需要分别处理
xz -d test/*.xz
# 可能导致元数据丢失

使用tar先打包

# 打包并压缩(常用组合)
$ tar -czf archive.tar.gz folder/
# -c: 创建归档
# -z: 通过 gzip 压缩
# -f: 指定归档文件

# 一个命令完成打包+压缩,一个命令完成解压+解包
$ tar -xzf archive.tar.gz
# 完整恢复:目录结构、权限、时间戳全部保留

tar的独特优势

  • 保留权限(755/644)
  • 保留所有者(uid/gid)
  • 保留硬链接
  • 保留符号链接
  • 保留时间戳
  • 增量备份
  • 追加文件到已有归档
  • 跨多卷磁带/磁盘

常用组合

# 打包并压缩
tar -czvf archive.tar.gz file1 file2 dir1 # gzip压缩
tar -cjvf archive.tar.baz file1 file2 dir1 # bzip2压缩
tar -cJvf archive.tar.xz file1 file2 dir1 # xz压缩

# 解包解压
tar -xzvf archive.tar.gz # 解压.gz
tar -xjvf archive.tar.bz2 # 解压.bz2
tar -xJvf archive.tar.xz # 解压.xz

# 仅查看内容不解压
tar -tzvf archive.tar.gz

# 查看归档内容(不解压)
tar -tf archive.tar.gz

# 解压到指定目录
tar -xzf archive.tar.gz -C /target/path/

# 只打包,不压缩(速度最快)
tar-cf archive.tar folder/

参数

  • -c:创建归档
  • -x:提取归档
  • -z:使用gzip
  • -j:使用bzip2
  • -J:使用xz
  • -v:显示详细信息
  • -f:指定文件名
  • -t:列出归档内容