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(磁带归档),最初设计用于磁带备份。它的核心功能是
- 将多个文件/目录合并成单个文件流
- 保留文件元数据(权限、所有者、时间戳、目录结构)
- 支持追加、增量备份等操作
# 压缩一个目录下的所有文件(每个文件独立压缩),不能包含文件夹
$ 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:列出归档内容