.gz - gzip压缩文件.z - compress压缩文件(旧格式).Z - compress压缩文件.tgz - tar+gzip压缩包.tar.gz - tar+gzip压缩包-gz、-z、_zgunzip [选项] [文件名...]
| 参数 | 说明 |
|---|---|
| -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 | 解压文件(默认行为) |
# 解压单个.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
# 将解压内容输出到屏幕
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
# 列出压缩文件信息
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}'
# 测试单个文件完整性
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$"
# 递归解压目录下所有.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 {} \;
# 方法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
# 恢复原始文件名和时间戳
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)
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
# 查看文件头信息
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
#!/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
#!/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 "=== 处理完成 ==="
#!/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 | 极快 | 中等 | 可调 | 速度极快,现代格式 |
-k选项保留-f)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
-f选项:强制解压,忽略错误zcat:尝试输出尽可能多的数据# 尝试强制解压
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
| 格式 | 扩展名 | 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
压缩文件为.gz格式:
gzip file.txt
gzip -9 file.txt
gzip -k file.txt
gzip -r directory/
查看.gz文件内容:
zcat file.gz
zcat file.gz | less
zcat file.gz | grep pattern
zcat file.gz > file.txt
处理.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