Linux 压缩与解压缩

一、压缩基础概念

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/  
相关推荐
QT 小鲜肉1 天前
【Linux命令大全】003.文档编辑之csplit命令(实操篇)
linux·运维·服务器·chrome·mysql
itas1091 天前
Linux交叉编译工具链
linux·运维·服务器·交叉编译·cross-compile
胖好白1 天前
【咸鱼RK3399】打造NAS(Debian+Docker+CasaOS)
linux·docker·debian
zfxwasaboy1 天前
DRM KMS 子系统(2)Framebuffer
linux·c语言
QT 小鲜肉1 天前
【Linux命令大全】002.文件传输之lpr命令(实操篇)
linux·运维·服务器·网络·chrome·笔记
最后一个bug1 天前
为什么linux内存要分DMA区域,常规区域和高端内存区域?
linux·服务器·开发语言·系统架构·计算机外设
qq_447429411 天前
Qwen Code CanUseTool 实现分析
linux·运维·服务器
The Sheep 20231 天前
可视化命中测试
java·服务器·前端
wadesir1 天前
Ubuntu系统安装Miniconda完整指南
linux·运维·ubuntu