Linux gunzip命令

功能说明:gunzip命令用于解压缩由gzip压缩的文件(扩展名为.gz、.z、.Z、.tgz等)。它是gzip工具的配套解压程序,广泛用于Linux系统中处理压缩文件。
主要功能
  • 解压缩.gz、.z、.Z文件
  • 处理.tgz和.tar.gz文件
  • 保留原始文件(可选)
  • 解压到标准输出
  • 测试压缩文件完整性
  • 恢复压缩文件
支持的文件格式
  • .gz - gzip压缩文件
  • .z - compress压缩文件(旧格式)
  • .Z - compress压缩文件
  • .tgz - tar+gzip压缩包
  • .tar.gz - tar+gzip压缩包
  • -gz-z_z

命令语法

语法格式
gunzip [选项] [文件名...]

命令参数

参数 说明
-f, --force 强制覆盖已存在的输出文件
-h, --help 显示帮助信息
-k, --keep 解压后保留原压缩文件(不删除)
-l, --list 列出压缩文件的内容信息
-L, --license 显示软件许可证信息
-N, --name 恢复原始文件名和时间戳
-q, --quiet 静默模式,不显示警告信息
-r, --recursive 递归处理目录下的所有文件
-S, --suffix 后缀 指定压缩文件的后缀名
-t, --test 测试压缩文件的完整性
-v, --verbose 详细模式,显示处理信息
-V, --version 显示版本信息
-1 ... -9 压缩级别(与gzip兼容)
-c, --stdout 将解压内容输出到标准输出
-d, --decompress 解压文件(默认行为)

使用示例

1. 基本解压操作 常用
示例
# 解压单个.gz文件(默认删除原压缩文件)
gunzip file.txt.gz
# 解压后得到:file.txt,原file.txt.gz被删除

# 解压并保留原压缩文件
gunzip -k archive.gz
# 或
gunzip --keep data.gz

# 解压多个.gz文件
gunzip file1.gz file2.gz file3.gz

# 解压.z或.Z文件(旧格式)
gunzip file.z
gunzip file.Z

# 解压到不同目录
gunzip -c /path/to/source/file.gz > /new/path/file.txt
2. 解压到标准输出
# 将解压内容输出到屏幕
gunzip -c file.txt.gz

# 查看压缩文件内容
gunzip -c file.txt.gz | less

# 搜索压缩文件内容
gunzip -c logfile.gz | grep "error"

# 解压并统计行数
gunzip -c file.txt.gz | wc -l

# 解压并保存到新文件
gunzip -c archive.gz > extracted_file.txt

# 实时监控日志文件
tail -f access.log | gzip | gunzip -c
3. 查看压缩文件信息
# 列出压缩文件信息
gunzip -l file.gz
# 输出示例:
# compressed        uncompressed  ratio uncompressed_name
#       1240             4096  70.3% file.txt

# 详细列出信息
gunzip -lv archive.gz

# 查看多个文件信息
gunzip -l *.gz

# 只显示总计信息
gunzip -l *.gz | tail -1

# 查看压缩比
gunzip -l file.gz | awk 'NR==2 {printf "压缩比: %.1f%%\n", $4}'
4. 测试压缩文件完整性
# 测试单个文件完整性
gunzip -t file.gz
# 如果没有错误,不会有输出

# 测试多个文件
gunzip -t file1.gz file2.gz file3.gz

# 详细测试模式
gunzip -tv archive.gz
# 输出:archive.gz: OK

# 在脚本中测试文件完整性
if gunzip -t backup.gz 2>/dev/null; then
    echo "压缩文件完整"
else
    echo "压缩文件可能损坏"
fi

# 批量测试目录下所有.gz文件
find . -name "*.gz" -exec gunzip -t {} \; 2>&1 | grep -v "OK$"
5. 递归解压目录
# 递归解压目录下所有.gz文件
gunzip -r /path/to/directory

# 递归解压并保留原文件
gunzip -rk /path/to/directory

# 递归解压并显示详细信息
gunzip -rv /path/to/directory

# 递归解压特定扩展名文件
find . -name "*.gz" -exec gunzip {} \;

# 递归解压并测试完整性
find . -name "*.gz" -exec gunzip -t {} \; && \
find . -name "*.gz" -exec gunzip {} \;
6. 处理.tar.gz和.tgz文件
# 方法1:先解压.gz,再解压.tar
gunzip archive.tar.gz
tar -xvf archive.tar

# 方法2:使用管道
gunzip -c archive.tar.gz | tar -xv

# 方法3:使用tar命令直接解压(推荐)
tar -xzvf archive.tar.gz
# 参数说明:
# -x 解压
# -z 使用gzip解压
# -v 显示详细信息
# -f 指定文件名

# 解压.tgz文件(等同于.tar.gz)
tar -xzvf package.tgz

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

# 只列出内容不提取
tar -tzvf archive.tar.gz
7. 高级用法示例
# 恢复原始文件名和时间戳
gunzip -N file.gz

# 指定不同的压缩文件后缀
gunzip -S .compressed file.compressed

# 静默模式解压
gunzip -q largefile.gz

# 强制覆盖已存在的文件
gunzip -f file.gz

# 解压网络上的压缩文件
curl -s http://example.com/file.gz | gunzip -c > file.txt

# 比较两个压缩文件内容
diff <(gunzip -c file1.gz) <(gunzip -c file2.gz)

与gzip的关系

gunzip和gzip是同一个软件包中的两个命令,它们实际上是指向同一个二进制文件的不同链接:

命令 主要功能 默认行为 等价命令
gunzip 解压文件 解压.gz、.z、.Z文件 gzip -d
gzip 压缩文件 压缩文件为.gz格式 gunzip -c(解压到标准输出)
zcat 查看压缩内容 相当于gunzip -c gunzip -c 或 gzip -dc
gzcat 查看.gz内容 某些系统中等于zcat gunzip -c
命令链接关系验证
# 查看命令的链接关系
ls -l $(which gzip) $(which gunzip) $(which zcat) 2>/dev/null
# 输出示例:
# lrwxrwxrwx 1 root root 4 Nov 15  2022 /usr/bin/gunzip -> gzip*
# lrwxrwxrwx 1 root root 4 Nov 15  2022 /usr/bin/zcat -> gzip*
# -rwxr-xr-x 1 root root 105K Nov 15  2022 /usr/bin/gzip*

# 验证它们是同一个文件
ls -i $(which gzip) $(which gunzip) $(which zcat) 2>/dev/null
# 输出相同的inode号

# 测试功能
echo "test content" > test.txt
gzip test.txt
zcat test.txt.gz
# 输出:test content
gunzip test.txt.gz
cat test.txt
# 输出:test content

gzip压缩格式详解

gzip文件格式结构
文件头(10字节)
  • ID1, ID2: 0x1f, 0x8b(魔数)
  • CM: 压缩方法(8=deflate)
  • FLG: 标志位
  • MTIME: 修改时间(Unix时间戳)
  • XFL: 额外标志
  • OS: 操作系统
可选字段
  • FEXTRA: 额外字段
  • FNAME: 原始文件名
  • FCOMMENT: 注释
  • FHCRC: CRC16校验
查看gzip文件原始信息
# 查看文件头信息
file archive.gz
# 输出:archive.gz: gzip compressed data, ...

# 十六进制查看文件头
head -c 20 archive.gz | od -x
# 输出:
# 0000000 8b1f 0808 5e5c 5b61 0003 6c66 6761 7a2e
# 0000020 7000

# 查看gzip文件详细信息
gzip -l archive.gz

# 查看原始文件名和时间戳
gunzip -N -l archive.gz

# 使用strings查看可读字符串
strings archive.gz | head -5

实际应用脚本

脚本1:批量解压和验证脚本
#!/bin/bash
# 批量解压.gz文件并验证完整性

SOURCE_DIR="/data/compressed"
TARGET_DIR="/data/extracted"
LOG_FILE="/var/log/gunzip_script.log"
ERROR_LOG="/var/log/gunzip_errors.log"

# 创建目录
mkdir -p "$SOURCE_DIR" "$TARGET_DIR"

# 初始化日志
echo "=== 批量解压开始 $(date) ===" > "$LOG_FILE"
echo "源目录: $SOURCE_DIR" >> "$LOG_FILE"
echo "目标目录: $TARGET_DIR" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

# 计数器
total=0
success=0
failed=0
corrupted=0

# 查找所有.gz文件
find "$SOURCE_DIR" -name "*.gz" -type f | while read gz_file; do
    total=$((total + 1))
    filename=$(basename "$gz_file")
    target_name="${filename%.gz}"

    echo "处理: $filename" | tee -a "$LOG_FILE"

    # 测试文件完整性
    if ! gunzip -t "$gz_file" 2>/dev/null; then
        echo "  ✗ 文件损坏: $filename" | tee -a "$LOG_FILE" >> "$ERROR_LOG"
        corrupted=$((corrupted + 1))
        continue
    fi

    # 解压文件
    echo -n "  解压中..." | tee -a "$LOG_FILE"
    if gunzip -c "$gz_file" > "$TARGET_DIR/$target_name" 2>/dev/null; then
        # 验证解压文件
        if [ -s "$TARGET_DIR/$target_name" ]; then
            echo "✓ 成功" | tee -a "$LOG_FILE"
            success=$((success + 1))

            # 记录文件信息
            original_size=$(gunzip -l "$gz_file" | awk 'NR==2 {print $2}')
            compressed_size=$(gunzip -l "$gz_file" | awk 'NR==2 {print $1}')
            ratio=$(gunzip -l "$gz_file" | awk 'NR==2 {print $4}')
            echo "  原始: ${original_size}B, 压缩: ${compressed_size}B, 压缩比: $ratio" >> "$LOG_FILE"
        else
            echo "✗ 解压文件为空" | tee -a "$LOG_FILE" >> "$ERROR_LOG"
            failed=$((failed + 1))
        fi
    else
        echo "✗ 解压失败" | tee -a "$LOG_FILE" >> "$ERROR_LOG"
        failed=$((failed + 1))
    fi

    echo "" >> "$LOG_FILE"
done

# 统计信息
echo "" >> "$LOG_FILE"
echo "=== 处理完成 ===" >> "$LOG_FILE"
echo "总文件数: $total" >> "$LOG_FILE"
echo "成功解压: $success" >> "$LOG_FILE"
echo "解压失败: $failed" >> "$LOG_FILE"
echo "损坏文件: $corrupted" >> "$LOG_FILE"

# 显示摘要
echo ""
echo "=== 批量解压完成 ==="
echo "详情查看日志: $LOG_FILE"
if [ -f "$ERROR_LOG" ]; then
    echo "错误信息: $ERROR_LOG"
fi
脚本2:日志文件自动解压和轮转
#!/bin/bash
# 自动解压和轮转日志文件

LOG_DIR="/var/log"
COMPRESSED_DIR="/var/log/compressed"
RETENTION_DAYS=30
MIN_SIZE="1M"

# 创建目录
mkdir -p "$COMPRESSED_DIR"

echo "=== 日志文件解压轮转工具 ==="
echo "扫描目录: $LOG_DIR"
echo "保留天数: $RETENTION_DAYS"
echo "最小大小: $MIN_SIZE"
echo ""

# 查找需要处理的.gz文件
find "$LOG_DIR" -name "*.gz" -type f -mtime +1 -size +$MIN_SIZE | while read gz_file; do
    filename=$(basename "$gz_file")
    filepath=$(dirname "$gz_file")

    echo "处理: $filename"

    # 检查文件是否正在被使用
    if lsof "$gz_file" >/dev/null 2>&1; then
        echo "  ⚠ 文件正在使用,跳过"
        continue
    fi

    # 测试文件完整性
    if ! gunzip -t "$gz_file" 2>/dev/null; then
        echo "  ✗ 文件损坏,移动到隔离区"
        mkdir -p "$LOG_DIR/corrupted"
        mv "$gz_file" "$LOG_DIR/corrupted/"
        continue
    fi

    # 解压文件
    uncompressed_name="${filename%.gz}"
    uncompressed_path="$filepath/$uncompressed_name"

    echo -n "  解压..."
    if gunzip -k "$gz_file" 2>/dev/null; then
        echo "✓ 完成"

        # 检查解压文件
        if [ -f "$uncompressed_path" ] && [ -s "$uncompressed_path" ]; then
            uncompressed_size=$(stat -c%s "$uncompressed_path")
            compressed_size=$(stat -c%s "$gz_file")
            ratio=$(echo "scale=1; ($compressed_size*100)/$uncompressed_size" | bc)

            echo "  大小: ${uncompressed_size}B (压缩比: ${ratio}%)"

            # 移动原压缩文件到存档目录
            mv "$gz_file" "$COMPRESSED_DIR/"
            echo "  原压缩文件已存档"
        else
            echo "  ✗ 解压文件无效"
        fi
    else
        echo "✗ 解压失败"
    fi

    echo ""
done

# 清理旧文件
echo "清理超过${RETENTION_DAYS}天的文件..."
find "$LOG_DIR" -name "*.gz" -type f -mtime +$RETENTION_DAYS -delete
find "$COMPRESSED_DIR" -name "*.gz" -type f -mtime +$RETENTION_DAYS -delete

echo ""
echo "磁盘使用情况:"
du -sh "$LOG_DIR"
du -sh "$COMPRESSED_DIR" 2>/dev/null || true
echo ""

echo "=== 处理完成 ==="
脚本3:智能解压工具(交互式)
#!/bin/bash
# 交互式gunzip解压工具

VERSION="1.0"
AUTHOR="System Admin"

show_menu() {
    clear
    echo "╔════════════════════════════════════╗"
    echo "║      gunzip智能解压工具 v$VERSION    ║"
    echo "╚════════════════════════════════════╝"
    echo ""
    echo "1. 解压单个文件"
    echo "2. 批量解压目录"
    echo "3. 测试压缩文件完整性"
    echo "4. 查看压缩文件信息"
    echo "5. 处理.tar.gz文件"
    echo "6. 递归解压子目录"
    echo "7. 批量重命名解压文件"
    echo "8. 退出"
    echo ""
    echo -n "请选择操作 [1-8]: "
}

single_extract() {
    echo -n "请输入.gz文件路径: "
    read filepath

    if [ ! -f "$filepath" ]; then
        echo "错误: 文件不存在"
        read -p "按回车键继续..."
        return
    fi

    if [[ ! "$filepath" =~ \.gz$ ]] && [[ ! "$filepath" =~ \.tgz$ ]] && \
       [[ ! "$filepath" =~ \.z$ ]] && [[ ! "$filepath" =~ \.Z$ ]]; then
        echo "警告: 文件可能不是gzip格式"
    fi

    echo -n "解压后保留原文件? [y/N]: "
    read keep_original

    echo -n "输出目录 (留空为当前目录): "
    read output_dir

    options=""
    if [[ "$keep_original" =~ ^[Yy]$ ]]; then
        options="$options -k"
    fi

    if [ -n "$output_dir" ]; then
        mkdir -p "$output_dir"
        filename=$(basename "$filepath")
        target_name="${filename%.gz}"
        target_name="${target_name%.tgz}"
        target_name="${target_name%.z}"
        target_name="${target_name%.Z}"

        if [[ "$filepath" =~ \.tar\.gz$ ]] || [[ "$filepath" =~ \.tgz$ ]]; then
            echo "检测到.tar.gz文件,使用tar解压..."
            tar -xzf "$filepath" -C "$output_dir"
        else
            gunzip $options -c "$filepath" > "$output_dir/$target_name"
        fi
    else
        if [[ "$filepath" =~ \.tar\.gz$ ]] || [[ "$filepath" =~ \.tgz$ ]]; then
            echo "检测到.tar.gz文件,使用tar解压..."
            tar -xzf "$filepath"
        else
            gunzip $options "$filepath"
        fi
    fi

    if [ $? -eq 0 ]; then
        echo "✓ 解压成功"
    else
        echo "✗ 解压失败"
    fi

    read -p "按回车键继续..."
}

batch_extract() {
    echo -n "请输入目录路径: "
    read dirpath

    if [ ! -d "$dirpath" ]; then
        echo "错误: 目录不存在"
        read -p "按回车键继续..."
        return
    fi

    count=$(find "$dirpath" -name "*.gz" -o -name "*.tgz" -o -name "*.z" -o -name "*.Z" | wc -l)
    if [ "$count" -eq 0 ]; then
        echo "没有找到.gz/.tgz/.z/.Z文件"
        read -p "按回车键继续..."
        return
    fi

    echo "找到 $count 个压缩文件"
    echo -n "是否开始解压? [y/N]: "
    read confirm

    if [[ "$confirm" =~ ^[Yy]$ ]]; then
        echo -n "保留原文件? [y/N]: "
        read keep
        echo -n "显示详细信息? [y/N]: "
        read verbose

        options=""
        [[ "$keep" =~ ^[Yy]$ ]] && options="$options -k"
        [[ "$verbose" =~ ^[Yy]$ ]] && options="$options -v"

        find "$dirpath" \( -name "*.gz" -o -name "*.tgz" -o -name "*.z" -o -name "*.Z" \) \
            -exec gunzip $options {} \;

        echo "批量解压完成"
    fi

    read -p "按回车键继续..."
}

# 主循环
while true; do
    show_menu
    read choice

    case $choice in
        1) single_extract ;;
        2) batch_extract ;;
        3)
            echo -n "请输入文件路径: "
            read testfile
            gunzip -t "$testfile" && echo "✓ 文件完整" || echo "✗ 文件损坏"
            read -p "按回车键继续..."
            ;;
        4)
            echo -n "请输入文件路径: "
            read infofile
            gunzip -l "$infofile"
            read -p "按回车键继续..."
            ;;
        5)
            echo -n "请输入.tar.gz文件路径: "
            read tarfile
            echo -n "解压到目录: "
            read tardir
            mkdir -p "$tardir"
            tar -xzf "$tarfile" -C "$tardir" && echo "✓ 解压成功" || echo "✗ 解压失败"
            read -p "按回车键继续..."
            ;;
        6)
            echo -n "请输入目录路径: "
            read recurdir
            gunzip -r "$recurdir" && echo "✓ 递归解压完成" || echo "✗ 解压失败"
            read -p "按回车键继续..."
            ;;
        7)
            echo "批量重命名功能开发中..."
            read -p "按回车键继续..."
            ;;
        8)
            echo "再见!"
            exit 0
            ;;
        *)
            echo "无效选择"
            read -p "按回车键继续..."
            ;;
    esac
done

与其他解压工具对比

工具 格式 解压速度 兼容性 压缩率 特点
gunzip .gz, .z, .Z 极好 中等 标准Unix工具,广泛支持
bunzip2 .bz2 中等 压缩率高,适合文本
unxz .xz 中等 很高 最高压缩率,内存占用高
unzip .zip 极好 中等 跨平台,Windows兼容
7z .7z 中等 很高 高压缩率,多种格式
zstd .zst 极快 中等 可调 速度极快,现代格式

注意事项

重要注意事项:
  • 文件删除:默认情况下,gunzip解压后会删除原压缩文件,使用-k选项保留
  • 文件名冲突:如果解压后的文件名已存在,会询问是否覆盖(除非使用-f
  • 文件权限:解压后的文件会保留原文件的权限(如果压缩时包含)
  • 符号链接:gunzip不会解压符号链接,而是解压链接指向的实际文件
  • 磁盘空间:确保有足够的磁盘空间存放解压后的文件
  • 大文件处理:处理超大.gz文件时,注意内存和磁盘限制
  • 编码问题:处理非ASCII文件名时可能有问题,建议使用简单文件名
  • 压缩格式:gunzip只能解压gzip、compress和pack格式,不能解压.zip、.rar等

常见问题

A: 它们实际上是同一个程序的不同名称:
  • gunzip:默认解压文件,删除原压缩文件
  • gzip -d:与gunzip完全相同(d=decompress)
  • zcat:解压到标准输出,不删除原文件(相当于gunzip -c
  • gzcat:在某些系统中是zcat的别名
示例:
# 完全相同的功能
gunzip file.gz
gzip -d file.gz

# 查看内容而不解压
zcat file.gz
gunzip -c file.gz
gzip -dc file.gz

# 验证
echo "test" > test.txt
gzip test.txt
zcat test.txt.gz
# 输出:test
gunzip test.txt.gz
cat test.txt
# 输出:test

A: 可以尝试以下方法恢复损坏的.gz文件:
  • 使用-f选项:强制解压,忽略错误
  • 使用zcat尝试输出尽可能多的数据
  • 修复工具:使用gzip修复工具(如gzip-repair)
  • 手动修复:用十六进制编辑器手动修复
示例:
# 尝试强制解压
gunzip -f corrupted.gz 2>/dev/null

# 尝试输出尽可能多的数据
zcat corrupted.gz 2>/dev/null | head -c 1000000 > partial_recovery.txt

# 跳过文件开头损坏部分
dd if=corrupted.gz of=partial.gz bs=1 skip=100
gunzip -f partial.gz 2>/dev/null

# 尝试修复CRC错误
# 有些工具可以尝试修复CRC校验错误

# 使用strings提取文本内容
strings corrupted.gz > recovered_text.txt

A: 不能。gunzip只能解压gzip、compress和pack格式:
格式 扩展名 gunzip支持 替代工具
gzip .gz, .z, .Z ✓ 支持 gunzip, gzip -d
ZIP .zip ✗ 不支持 unzip, 7z
RAR .rar ✗ 不支持 unrar, 7z
7-Zip .7z ✗ 不支持 7z, 7za
bzip2 .bz2 ✗ 不支持 bunzip2, bzip2 -d
xz .xz ✗ 不支持 unxz, xz -d
正确工具选择:
# .gz文件 -> gunzip
gunzip file.gz

# .zip文件 -> unzip
unzip archive.zip

# .bz2文件 -> bunzip2
bunzip2 file.bz2

# .xz文件 -> unxz
unxz file.xz

# .tar.gz文件 -> tar
tar -xzf archive.tar.gz

# 通用解压工具
7z x archive.7z
7z x archive.zip
7z x archive.tar.gz

相关命令

gzip

压缩文件为.gz格式:

gzip file.txt
gzip -9 file.txt
gzip -k file.txt
gzip -r directory/
zcat

查看.gz文件内容:

zcat file.gz
zcat file.gz | less
zcat file.gz | grep pattern
zcat file.gz > file.txt
tar

处理.tar.gz压缩包:

tar -xzf archive.tar.gz
tar -czf archive.tar.gz files/
tar -tzf archive.tar.gz
tar -xzf archive.tar.gz -C /path
其他解压工具

其他格式解压:

bunzip2 file.bz2
unxz file.xz
unzip archive.zip
7z x archive.7z