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