一、压缩基础概念
1.1 压缩原理与类型
| 压缩类型 | 原理 | 特点 | 常见工具 |
|---|---|---|---|
| 有损压缩 | 丢弃不必要数据 | 文件变小,质量降低 | JPEG、MP3 |
| 无损压缩 | 算法压缩,可完全恢复 | 保持原文件质量 | gzip、bzip2、xz |
| 归档+压缩 | 先打包再压缩 | 处理多个文件 | tar + 压缩工具 |
1.2 压缩格式比较
| 格式 | 扩展名 | 压缩率 | 速度 | CPU占用 | 工具 |
|---|---|---|---|---|---|
| gzip | .gz | 中等 | 快 | 低 | gzip, gunzip |
| bzip2 | .bz2 | 高 | 慢 | 高 | bzip2, bunzip2 |
| xz | .xz | 很高 | 很慢 | 很高 | xz, unxz |
| zip | .zip | 中等 | 中等 | 中等 | zip, unzip |
| 7z | .7z | 很高 | 慢 | 高 | 7z, 7za |
| Z | .Z | 低 | 快 | 低 | compress |
二、gzip/gunzip 工具
2.1 gzip - 压缩文件
命令格式:
bash
gzip [选项] 文件
常用选项:
-k:压缩并保留原文件-c:压缩到标准输出-9:最大压缩率(最慢)-1:最快压缩(压缩率最低)-d:解压缩-l:查看压缩文件信息-t:测试压缩文件完整性-r:递归压缩目录中所有文件-v:显示详细信息
使用示例:
bash
# 压缩当前目录下document.pdf 文件为document.pdf.gz
gzip document.pdf
# 压缩多个文件(每个文件单独压缩)
gzip file1.txt file2.txt file3.txt
# 压缩当前目录下的所有文件,目录不会进行压缩
gzip *
# 保留原文件压缩
gzip -k important.log
# 最大压缩率
gzip -9 large_file.dat
# 压缩/test目录以及其子目录下的所有文件
gzip -r /test
# 显示将file.txt 文件为file.txt.gz的执行过程
gzip -v file.txt
# 查看file.txt.gz压缩文件中的内容
gzip -l file.txt.gz
# compressed uncompressed ratio uncompressed_name
# 123456 654321 81.0% data.txt
# 解压缩file.txt.gz压缩文件
gzip -d file.txt.gz
2.2 gunzip - 解压缩
命令格式:
bash
gunzip [选项] 文件.gz
常用选项:
-k:解压并保留压缩文件-c:解压到标准输出-l:列出压缩文件的相关信息-d:解压(等同于gzip -d)-t:测试压缩文件-r:递归解压目录-f:强行解开压缩文件,不理会文件名称或硬连接是否存在以及该文件是否为符号连接-q:不显示警告信息-v:显示详细信息
使用示例:
bash
# 解压缩file.txt.gz文件到当前目录
gunzip file.txt.gz
# 保留压缩文件
gunzip -k backup.gz
# 解压缩file.txt.gz文件时显示执行过程
gunzip -v file.txt.gz
# 查看压缩包内容
gunzip -l file.txt.gz
# 查看前10行
gunzip -c data.gz | head -n 10
# 递归解压目录
gunzip -r compressed_logs/
三、bzip2/bunzip2 工具
3.1 bzip2 - 高压缩率工具
命令格式:
bash
bzip2 [选项] 文件
常用选项:
-k:压缩并保留原文件-9:最大压缩率(默认)-1:最快压缩-d:解压缩-f:强行压缩文件,若输出文件与现有文件同名会直接覆盖现有文件-t:测试完整性-l:查看压缩文件信息-v:显示详细信息
使用示例:
bash
# 将test.txt文件压缩成.bz2格式,并删除test.txt文件
bzip2 test.txt
# 将test.txt文件压缩成.bz2格式,并保留test.txt文件
bzip2 -k test.txt
# 最大压缩并显示信息
bzip2 -v -9 important.log
# 强制将test.txt文件压缩成.bz2格式,并显示压缩的详细信息
bzip2 -fv test.txt
# 测试test.txt.bz2压缩文件的完整性
bzip2 -t test.txt.bz2
# 查看压缩信息
bzip2 -l data.bz2
# 文件大小 压缩后大小 压缩率 解压后大小 文件名
# 将test.txt.bz2压缩文件进行解压
bzip2 -d test.txt.bz2
3.2 bunzip2 - 解压缩
命令格式:
bash
bunzip2 [选项] 文件.bz2
常用选项:
-k:完成解压后,会保留有原文件-c:解压到标准输出-d:解压(等同于bzip2 -d)-t:测试完整性-f:强行解压,若输出文件与现有文件同名会直接覆盖现有文件-v:显示详细信息
使用示例:
bash
# 解压test.txt.bz2文件,完成解压后删除test.txt.bz2文件
bunzip2 test.txt.bz2
# 解压test.txt.bz2文件,完成解压后保留test.txt.bz2文件
bunzip2 -k test.txt.bz2
# 最大压缩并显示信息
bzip2 -v -9 important.log
# 强制解压test.txt.bz2文件,若当前目录已存在解压的文件,直接覆盖掉当前目录下原有文件
bunzip2 -f test.txt.bz2
# 查看压缩信息
bzip2 -l data.bz2
# 文件大小 压缩后大小 压缩率 解压后大小 文件名
四、zip/unzip - 跨平台压缩工具
4.1 zip - 创建ZIP压缩包
命令格式:
bash
zip [选项] 压缩包名.zip 文件...
常用选项:
-r:递归压缩目录-e:加密压缩(设置密码)-9:最大压缩率(0-9,默认6)-p password:直接指定密码(不安全)-q:安静模式(不显示输出)-u:更新压缩包(添加新文件)-m:压缩后删除原文件-F:修复损坏的ZIP文件-T:测试ZIP文件完整性-v:显示详细信息-j:不包含路径(只存储文件名)-y:存储符号链接本身(不指向目标)-n:不压缩指定扩展名的文件-x:指定不压缩的文件
使用示例:
bash
# 创建基本ZIP
zip backup.zip important.txt config.ini
# 压缩目录
zip -r website.zip /var/www/html
# 加密压缩
zip -e secret.zip confidential.pdf
# 会提示输入密码
# 最大压缩率
zip -9 archive.zip large_file.iso
# 排除某些文件
zip -r backup.zip /home -x "*.mp4" "*.iso"
# 从文件列表创建
find . -name "*.txt" | zip -@ textfiles.zip
# 更新现有ZIP
zip -u backup.zip new_document.pdf
4.2 unzip - 解压ZIP文件
命令格式:
bash
unzip [选项] 压缩包.zip
常用选项:
-l:查看压缩文件内所包含的文件,但不进行解压-v:查看文件详细信息,也不进行解压-n:解压缩时不要覆盖原有的文件-o:不必先询问用户,执行后覆盖原有文件-d <存储目录>:指定文件解压缩后所要存储的目录-t:检查压缩文件是否损坏-j:忽略目录结构(所有文件到当前目录)-P:使用密码解压-q:安静模式(不显示输出)-x:解压时排除某些文件
使用示例:
bash
# 基本解压
unzip backup.zip
# 解压到特定目录
unzip archive.zip -d /tmp/extracted
# 列出内容
unzip -l archive.zip
# Archive: archive.zip
# Length Date Time Name
# --------- ---------- ----- ----
# 123456 2024-01-01 10:00 document.pdf
# 7890 2024-01-01 10:00 config.ini
# --------- -------
# 131346 2 files
# 解压特定文件
unzip archive.zip "*.pdf" "*.doc" # 只解压PDF和DOC文件
# 密码解压
unzip -P mypassword encrypted.zip
# 测试ZIP文件
unzip -t archive.zip
# No errors detected in archive.zip.
# 交互式解压(解压时选择文件)
unzip archive.zip -x "*" # 先不解压任何文件
unzip archive.zip file1.txt file2.txt # 然后选择文件解压
五、xz/unxz - 高压缩率工具(现代)
5.1 xz - 压缩文件
命令格式:
bash
xz [选项] 文件
常用选项:
-c:压缩到stdout-k:压缩并保留原文件-9:最大压缩率(0-9,默认6)-0:不压缩(只做预处理)-e:极限压缩(比-9更好但更慢)-T4:使用4个线程压缩-v:显示压缩信息-l:列出压缩文件信息-d:解压缩(同unxz)-t:测试完整性
使用示例:
bash
# 压缩为large_archive.tar.xz
xz large_archive.tar
# 极限压缩并保留原文件
xz -9ek database.sql
# 使用所有CPU核心(T0=自动)
xz -T0 file.iso
# 压缩所有日志文件并显示信息
xz -v *.log
5.2 unxz - 解压缩
命令格式:
bash
unxz [选项] 文件.xz
常用选项:
-c:解压到stdout-k:解压并保留压缩文件-v:显示解压信息-T2:使用2个线程解压
使用示例:
bash
# 解压为archive.tar
unxz archive.tar.xz
# 解压并保留.xz文件
unxz -k data.xz
# 批量解压
unxz *.xz
六、7z - 高压缩率多格式工具
命令格式:
bash
7z [选项] [命令] 压缩包名称 [文件列表]
常用选项:
-m:设置压缩方法-p:设置密码-o:设置输出目录-r:递归子目录-y:对所有询问回答"是"-v:分卷压缩
常用命令:
a:添加文件到压缩包d:从压缩包删除文件e:解压文件到当前目录(无目录结构)x:解压文件保持完整目录结构l:列出压缩包内容t:测试压缩包完整性u:更新文件到压缩包rn:重命名压缩包内文件i:显示支持的格式信息
使用示例:
bash
# 基本压缩
7z a archive.7z file.txt # 压缩单个文件
7z a archive.7z file1.txt file2.jpg # 压缩多个文件
7z a archive.7z *.txt # 通配符压缩
7z a archive.7z directory/ # 压缩目录
# 递归压缩
7z a -r archive.7z folder/ # 递归压缩目录
7z a -r archive.7z *.log # 递归压缩所有log文件
# 指定压缩格式
7z a -t7z archive.7z files/ # 7z格式(默认)
7z a -tzip archive.zip files/ # zip格式
7z a -tgzip archive.gz file.txt # gzip格式(单文件)
7z a -tbzip2 archive.bz2 file.txt # bzip2格式(单文件)
7z a -ttar archive.tar files/ # tar格式(仅归档)
# 压缩级别控制(0-9)
7z a -mx0 archive.7z files/ # 仅复制(不压缩)
7z a -mx1 archive.7z files/ # 最快压缩
7z a -mx3 archive.7z files/ # 快速压缩
7z a -mx5 archive.7z files/ # 正常压缩(默认)
7z a -mx7 archive.7z files/ # 最大压缩
7z a -mx9 archive.7z files/ # 极限压缩
# 字典大小(影响压缩率和内存)
7z a -md16m archive.7z files/ # 16MB字典
7z a -md32m archive.7z files/ # 32MB字典
7z a -md64m archive.7z files/ # 64MB字典(默认)
7z a -md128m archive.7z files/ # 128MB字典
# 单词大小(影响文本压缩)
7z a -mfb32 archive.7z documents/ # 32个词位
7z a -mfb64 archive.7z documents/ # 64个词位
# 固实压缩(提高压缩率)
7z a -ms=on archive.7z files/ # 启用固实压缩
7z a -ms=off archive.7z files/ # 禁用固实压缩
7z a -ms archive.7z files/ # 默认固实模式
# 分卷压缩
7z a -v10m archive.7z largefile.iso # 10MB分卷
7z a -v1g archive.7z bigdata/ # 1GB分卷
7z a -v650m archive.7z diskimage.img # CD容量分卷
# 设置密码(加密文件名)
7z a -p archive.7z file.txt # 提示输入密码
7z a -p123456 archive.7z file.txt # 指定密码(不安全)
7z a -p'complex pass' archive.7z files/ # 复杂密码
# 加密文件名
7z a -pPASSWORD -mhe=on archive.7z secret/ # 加密文件名
# AES-256 加密
7z a -pPASSWORD -mhe=on -m0=AES256 archive.7z files/
# 基本列出
7z l archive.7z # 列出内容
7z l archive.zip
7z l archive.tar.gz
# 详细列出
7z l -slt archive.7z # 技术信息列表
7z l -slt archive.7z | grep -E "Path|Size|Method"
# 特定格式
7z l -slt archive.7z | grep "Method" # 查看压缩方法
7z l -slt archive.7z | grep "CRC" # 查看CRC校验
# 测试完整性
7z t archive.7z # 测试压缩包
7z t -r archive.7z # 递归测试所有压缩包
# 测试特定文件
7z t archive.7z file.txt # 测试单个文件
7z t archive.7z *.pdf # 测试pdf文件
# 完整路径解压(保持目录结构)
7z x archive.7z # 解压到当前目录
7z x archive.7z -ofolder/ # 解压到指定目录
7z x archive.7z -o/home/user/extract/ # 解压到绝对路径
# 解压到当前目录(不保持路径)
7z e archive.7z # 所有文件到当前目录
7z e archive.7z -ofolder/ # 解压到文件夹
# 解压特定文件
7z x archive.7z file.txt # 解压单个文件
7z x archive.7z *.jpg # 解压所有jpg文件
7z x archive.7z docs/*.pdf # 解压目录中的pdf文件
# 解压到标准输出
7z e -so archive.7z file.txt # 输出到stdout
7z e -so archive.7z file.txt | less # 查看内容
# 覆盖选项
7z x -aoa archive.7z # 直接覆盖所有文件
7z x -aos archive.7z # 跳过已存在文件
7z x -aou archive.7z # 自动重命名
7z x -aot archive.7z # 自动重命名现有文件
# 解压加密文件
7z x -pPASSWORD archive.7z # 密码解压
7z x -p archive.7z # 交互式输入密码
# 解压分卷压缩
7z x archive.7z.001 # 自动识别分卷
7z x archive.part1.7z # 自动处理连续分卷
# 解压并保持权限
7z x archive.tar.gz | tar xzf - # 配合tar保持权限
# 更新压缩包
7z u archive.7z newfile.txt # 添加或更新文件
7z u archive.7z *.log # 更新所有log文件
7z u -t7z -uq0 archive.7z folder/ # 仅更新新文件
# 从压缩包删除文件
7z d archive.7z file.txt # 删除单个文件
7z d archive.7z *.tmp # 删除所有tmp文件
7z d archive.7z -r folder/ # 删除目录
# 重命名压缩包内文件
7z rn archive.7z oldname.txt newname.txt # 重命名文件
7z rn archive.7z dir1/ dir2/ # 重命名目录
# 示例:
# 更新修改过的文件
find . -name "*.txt" -newer timestamp -exec 7z u archive.7z {} \;
# 删除过期文件
7z d archive.7z $(find . -name "*.log" -mtime +30)
# 批量重命名
7z rn archive.7z *.htm *.html # 扩展名批量修改
七、tar - 归档工具(打包与压缩结合)
命令格式:
bash
tar [选项] 压缩包名 文件...
常用选项:
-c:创建归档(打包)-x:提取归档(解包)-t:列出归档内容-r:追加文件到归档-u:更新比归档中新的文件-d:比较归档和文件系统差异-f:指定归档文件名(必须)-v:显示详细信息-z:使用gzip压缩/解压 (.tar.gz, .tgz)-j:使用bzip2压缩/解压 (.tar.bz2, .tbz2)-J:使用xz压缩/解压 (.tar.xz, .txz)-Z:使用compress压缩/解压 (.tar.Z)-C:切换到指定目录-k:不覆盖已存在文件
使用示例:
bash
# 创建归档(打包)
tar -cf archive.tar file1 file2 dir1/
tar -cvf archive.tar file1 file2 dir1/ # 显示过程
# 列出归档内容
tar -tf archive.tar
tar -tvf archive.tar # 详细列表
# 提取归档
tar -xf archive.tar
tar -xvf archive.tar # 显示过程
tar -xvf archive.tar -C /tmp # 提取到/tmp
# 创建并压缩归档
tar -czf archive.tar.gz files/ # gzip压缩 (.tar.gz)
tar -cjf archive.tar.bz2 files/ # bzip2压缩 (.tar.bz2)
tar -cJf archive.tar.xz files/ # xz压缩 (.tar.xz)
# 列出压缩归档内容
tar -tzf archive.tar.gz # gzip压缩的
tar -tjf archive.tar.bz2 # bzip2压缩的
tar -tJf archive.tar.xz # xz压缩的
# 提取压缩归档
tar -xzf archive.tar.gz # 解压.tar.gz
tar -xjf archive.tar.bz2 # 解压.tar.bz2
tar -xJf archive.tar.xz # 解压.tar.xz
# 追加文件到归档
tar -rf archive.tar newfile.txt
# 更新归档(添加新文件或更新的文件)
tar -uf archive.tar changedfile.txt
# 排除文件
tar -czf backup.tar.gz --exclude="*.log" --exclude="*.tmp" /home/
# 使用通配符
tar -czf docs.tar.gz *.pdf *.docx
# 从列表文件添加
tar -czf backup.tar.gz -T filelist.txt
# 多卷归档(分割)
tar -czf - large_dir/ | split -b 100M - backup.tar.gz.part
# 恢复:cat backup.tar.gz.part* | tar -xz
# 增量备份
tar -g snapshot.snar -czf backup-full.tar.gz /data
tar -g snapshot.snar -czf backup-incr.tar.gz /data
# 保留权限和属性
tar -cpzf backup.tar.gz --same-owner --numeric-owner /etc/
# 只打包不包含某些目录
tar -czf site.tar.gz --exclude="node_modules" --exclude=".git" website/