目录

一、压缩命令分类说明

1.1 压缩工具对比

工具 压缩格式 特点 适用场景
gzip .gz 压缩速度快,通用性好 单个文件压缩,日志压缩
bzip2 .bz2 压缩比优于gzip 需要较好压缩比的单个文件
xz .xz 压缩比最高,速度慢 发行版包,需要高压缩比
zip .zip 跨平台,支持目录 Windows兼容,目录打包

1.2 tar 命令:归档基础

tar本身是归档工具,常与压缩工具结合使用:

  • .tar.gz.tgz:tar + gzip
  • .tar.bz2:tar + bzip2
  • .tar.xz:tar + xz

二、压缩解压命令详解

2.1 tar 命令 - 归档工具

基本语法

tar [选项] 归档文件名 文件或目录...

常用选项组合

操作 选项组合 示例
创建归档 -cf tar -cf archive.tar files/
查看内容 -tf tar -tf archive.tar
解压归档 -xf tar -xf archive.tar
gzip压缩 -czf tar -czf archive.tar.gz files/
bzip2压缩 -cjf tar -cjf archive.tar.bz2 files/
xz压缩 -cJf tar -cJf archive.tar.xz files/

详细选项说明

选项 说明
-c 创建归档
-x 解压归档
-t 查看归档内容
-z 使用gzip压缩/解压
-j 使用bzip2压缩/解压
-J 使用xz压缩/解压
-v 显示详细过程
-f 指定归档文件名
-C 指定解压目录
--exclude 排除文件/目录

实战示例

# 创建普通归档
tar -cf project.tar my_project/

# 查看归档内容
tar -tf project.tar
tar -tvf project.tar                    # 详细列表

# 解压到当前目录
tar -xf backup.tar
tar -xvf backup.tar                     # 显示解压过程

# 解压到指定目录
tar -xf backup.tar -C /tmp/extract/

# 创建gzip压缩的tar包
tar -czf project.tar.gz my_project/
tar -czvf project.tar.gz my_project/   # 显示进度

# 创建bzip2压缩的tar包
tar -cjf project.tar.bz2 my_project/

# 创建xz压缩的tar包(高压缩比)
tar -cJf project.tar.xz my_project/

# 排除特定文件
tar -czf site.tar.gz --exclude="*.tmp" --exclude="logs/" website/

# 增量备份
tar -g snapshot -czf backup_full.tar.gz /data/        # 全量备份
tar -g snapshot -czf backup_incremental.tar.gz /data/ # 增量备份

2.2 gzip/gunzip 命令

功能说明

压缩/解压单个文件,生成.gz格式

基本语法

# 压缩
gzip [选项] 文件...

# 解压
gunzip [选项] 文件.gz
# 或
gzip -d 文件.gz

常用选项

选项 说明 示例
-d 解压文件 gzip -d file.gz
-c 输出到标准输出 gzip -c file > file.gz
-k 保留原文件 gzip -k file.txt
-1-9 压缩级别(1最快,9最好) gzip -9 large_file.log
-l 显示压缩文件信息 gzip -l file.gz

实战示例

# 基本压缩(原文件被删除)
gzip large_file.log
gzip file1.txt file2.txt                # 压缩多个文件

# 最大压缩比
gzip -9 best_compression.txt

# 保留原文件压缩
gzip -c original.txt > original.txt.gz
gzip -k keep_original.log

# 解压文件
gunzip file.txt.gz
gzip -d data.csv.gz

# 查看压缩信息
gzip -l compressed.log.gz

# 压缩目录中的所有文件
gzip *.log

# 查看压缩文件内容
zcat compressed.log.gz
zless large_file.txt.gz
zgreap "error" application.log.gz

2.3 xz 命令 - 高压缩比工具

功能说明

提供最高压缩比,适合压缩大文件

基本语法

# 压缩
xz [选项] 文件...

# 解压
unxz [选项] 文件.xz
# 或
xz -d 文件.xz

常用选项

选项 说明 示例
-d 解压 xz -d file.xz
-k 保留原文件 xz -k large_file.iso
-z 强制压缩 xz -z file.txt
-1-9 压缩级别 xz -9 huge_file.bin
-T 多线程压缩 xz -T4 big_file.img

实战示例

# 基本压缩
xz large_file.log                       # 生成large_file.log.xz

# 保留原文件压缩
xz -k original_file.bin

# 多线程压缩大文件
xz -T4 -9 large_database.dump

# 解压文件
unxz compressed_file.log.xz
xz -d backup.tar.xz

# 查看压缩信息
xz -l file.xz

# 与tar结合使用
tar -cJf backup.tar.xz /important/data/
tar -xJf backup.tar.xz

# 压缩比测试
time xz -9 large_file.bin
ls -lh large_file.bin*

2.4 zip/unzip 命令

功能说明

创建和解压zip格式,Windows兼容

基本语法

# 压缩
zip [选项] 压缩包名 文件...

# 解压
unzip [选项] 压缩包名

zip 常用选项

选项 说明 示例
-r 递归压缩目录 zip -r project.zip project/
-q 安静模式 zip -q quiet.zip files/
-e 加密压缩 zip -e secret.zip confidential.txt
-1-9 压缩级别 zip -9 max_compression.zip big_file
-s 分卷大小 zip -r -s 100m split.zip large_dir/
-x 排除文件 zip -r project.zip . -x "*.tmp"

unzip 常用选项

选项 说明 示例
-l 列出压缩包内容 unzip -l archive.zip
-d 指定解压目录 unzip data.zip -d /tmp/
-o 覆盖文件不提示 unzip -o backup.zip
-v 详细输出 unzip -v large.zip
-P 密码解压 unzip -P password encrypted.zip

实战示例

# 基本压缩
zip documents.zip file1.txt file2.doc
zip -r project.zip my_project/

# 加密压缩
zip -e secret.zip confidential.txt

# 分卷压缩(每卷100M)
zip -r -s 100m large_files.zip big_directory/

# 排除特定文件
zip -r website.zip public_html/ -x "*.log" "tmp/*"

# 列出压缩包内容
unzip -l documents.zip
unzip -v large_archive.zip

# 解压到指定目录
unzip data.zip -d /tmp/extract/

# 安静解压(覆盖现有文件)
unzip -q -o backup.zip

# 密码解压
unzip -P mypassword encrypted.zip

三、远程传输命令详解

3.1 scp 命令 - 安全文件传输

功能说明

基于SSH的安全文件传输

基本语法

scp [选项] 源文件 目标文件

# 本地 → 远程
scp 本地文件 用户名@远程主机:目标路径

# 远程 → 本地  
scp 用户名@远程主机:远程文件 本地路径

常用选项

选项 说明 示例
-P 指定SSH端口 scp -P 2222 file user@host:/path
-r 递归复制目录 scp -r dir/ user@host:/path
-C 压缩传输 scp -C large.iso user@host:/path
-i 指定密钥文件 scp -i key.pem file user@host:/path
-l 限制带宽(kbit/s) scp -l 1000 bigfile user@host:/path
-v 详细输出 scp -v file user@host:/path

实战示例

# 本地文件 → 远程服务器
scp document.txt student@192.168.1.100:/home/student/
scp backup.tar.gz admin@example.com:/backup/

# 远程文件 → 本地
scp student@192.168.1.100:/home/student/report.pdf ./
scp user@server:/var/log/app.log ./logs/

# 递归复制目录
scp -r my_project/ student@server:/home/student/

# 指定非标准端口
scp -P 2222 -r website/ admin@host:/var/www/

# 使用密钥认证
scp -i ~/.ssh/id_rsa -r data/ user@host:/backup/

# 带宽限制(避免影响网络)
scp -l 500 large_file.iso user@host:/tmp/

# 压缩传输大文件
scp -C database.dump user@host:/backup/

# 详细传输过程
scp -v bigfile.bin user@host:/tmp/

3.2 rsync 命令 - 智能文件同步

功能说明

增量同步,支持断点续传,适合备份和镜像

基本语法

rsync [选项] 源路径 目标路径

常用选项

选项 说明
-a 归档模式(保留所有属性)
-v 显示详细过程
-z 压缩传输
-r 递归同步目录
-u 只更新(不覆盖新文件)
-n 试运行(不实际执行)
-P 显示进度+断点续传
-L 同步符号链接指向的文件
--delete 删除目标多余文件
--exclude 排除文件/目录

本地同步示例

# 基本同步
rsync -av /home/student/documents/ /backup/documents/

# 增量备份(只同步变化部分)
rsync -avu /data/ /backup/daily/

# 镜像同步(目标与源完全一致)
rsync -av --delete /source/ /mirror/

# 试运行(查看将要同步的内容)
rsync -avun /source/ /backup/

# 显示进度(大文件传输)
rsync -avP large_file.iso /backup/

# 排除特定文件类型
rsync -av --exclude="*.tmp" --exclude=".git/" /project/ /backup/

远程同步示例

# 推送到远程服务器
rsync -avz /backup/ student@192.168.1.100:/remote/backup/

# 从远程服务器拉取
rsync -avz student@192.168.1.100:/home/student/ /local/backup/

# 使用SSH特定选项
rsync -av -e "ssh -p 2222" /data/ user@host:/backup/

# 带宽限制(1000KB/s)
rsync -avz --bwlimit=1000 large_files/ user@server:/backup/

# 部分传输(断点续传)
rsync -avP bigfile.tar.gz user@host:/downloads/

# 排除列表文件
rsync -av --exclude-from=exclude.list /data/ user@host:/backup/

高级同步技巧

# 增量备份链接(节省空间)
rsync -av --link-dest=/backup/previous/ /source/ /backup/new/

# 实时同步(简单监控)
while true; do
    rsync -av --delete /source/ /backup/latest/
    sleep 300  # 5分钟同步一次
done

# 备份脚本示例
#!/bin/bash
SOURCE="/important/data"
BACKUP="/backup/$(date +%Y%m%d)"
LOG="/var/log/backup.log"

echo "$(date): 开始备份" >> $LOG
rsync -av --delete $SOURCE $BACKUP >> $LOG 2>&1

if [ $? -eq 0 ]; then
    echo "$(date): 备份成功" >> $LOG
else
    echo "$(date): 备份失败" >> $LOG
fi

四、压缩格式对比与选择指南

4.1 压缩性能测试比较

创建测试文件

# 创建100MB测试文件
dd if=/dev/zero of=testfile bs=1M count=100

# 测试不同压缩工具
time gzip testfile
time bzip2 testfile  
time xz testfile
time zip testfile.zip testfile

# 比较压缩结果
ls -lh testfile.* | sort -k5 -h

压缩工具选择建议

# 速度优先(日常使用)
tar -czf backup.tar.gz data/           # ✅ 推荐

# 压缩比优先(归档存储)
tar -cJf archive.tar.xz important/     # ✅ 高压缩比

# Windows兼容
zip -r windows_backup.zip files/       # ✅ 跨平台

# 单个文件快速压缩
gzip logfile.log                       # ✅ 简单快速

五、综合课堂练习

练习1:备份脚本编写(25分钟)

任务:编写自动化备份脚本

# 要求:
# 1. 备份指定目录到远程服务器
# 2. 使用压缩归档,按日期命名
# 3. 保留7天内的备份
# 4. 记录备份日志
# 5. 错误处理和邮件通知

参考答案

#!/bin/bash
# auto_backup.sh

# 配置变量
SOURCE_DIRS=("/home/student/documents" "/etc" "/var/www")
BACKUP_SERVER="student@192.168.1.100"
REMOTE_DIR="/backup/$(hostname)"
BACKUP_NAME="backup_$(date +%Y%m%d_%H%M).tar.xz"
LOG_FILE="/var/log/backup.log"

# 创建本地临时备份
echo "$(date): 开始备份..." >> $LOG_FILE
tar -cJf /tmp/$BACKUP_NAME ${SOURCE_DIRS[@]} 2>/dev/null

if [ $? -eq 0 ]; then
    echo "$(date): 本地压缩成功" >> $LOG_FILE

    # 传输到远程服务器
    scp /tmp/$BACKUP_NAME $BACKUP_SERVER:$REMOTE_DIR/

    if [ $? -eq 0 ]; then
        echo "$(date): 远程传输成功" >> $LOG_FILE

        # 清理远程旧备份(7天前)
        ssh $BACKUP_SERVER "find $REMOTE_DIR -name '*.tar.xz' -mtime +7 -delete"
    else
        echo "$(date): 错误:远程传输失败" >> $LOG_FILE
    fi

    # 清理本地临时文件
    rm -f /tmp/$BACKUP_NAME
else
    echo "$(date): 错误:本地压缩失败" >> $LOG_FILE
fi

练习2:压缩工具性能测试(20分钟)

任务:比较不同压缩工具的性能

# 1. 创建测试数据(文本文件、二进制文件)
# 2. 测试gzip、bzip2、xz、zip的压缩时间和压缩比
# 3. 制作性能对比报告

参考答案

#!/bin/bash
# compression_test.sh

# 创建测试文件
echo "创建测试文件..."
dd if=/dev/urandom of=test_binary.bin bs=1M count=50
find /usr/share/doc -name "*.txt" -exec cat {} + > test_text.txt 2>/dev/null

# 测试函数
test_compression() {
    tool=$1
    file=$2
    level=$3

    echo -n "测试 $tool 级别 $level: "

    # 压缩时间测试
    start_time=$(date +%s)
    case $tool in
        "gzip") gzip -$level -c $file > $file.$level.gz ;;
        "bzip2") bzip2 -$level -c $file > $file.$level.bz2 ;;
        "xz") xz -$level -c $file > $file.$level.xz ;;
        "zip") zip -$level $file.$level.zip $file > /dev/null ;;
    esac
    end_time=$(date +%s)

    # 计算压缩比
    original_size=$(stat -c%s $file)
    compressed_size=$(stat -c%s $file.$level.* 2>/dev/null || echo 0)
    ratio=$(echo "scale=2; ($original_size - $compressed_size) / $original_size * 100" | bc)

    echo "$(($end_time - $start_time))秒, 压缩比: ${ratio}%"
}

# 执行测试
for file in test_binary.bin test_text.txt; do
    echo -e "\n测试文件: $file"
    echo "原始大小: $(stat -c%s $file) bytes"

    for level in 1 6 9; do
        test_compression "gzip" $file $level
    done
done

# 清理
rm -f test_* *.gz *.bz2 *.xz *.zip

练习3:增量同步实战(15分钟)

任务:配置增量同步系统

# 1. 设置本地到远程的增量同步
# 2. 实现每周全量备份+每日增量备份
# 3. 配置同步异常报警

参考答案

#!/bin/bash
# incremental_sync.sh

SOURCE="/data"
REMOTE="user@backup-server:/backup"
LOG="/var/log/sync.log"

# 根据日期判断备份类型
if [ $(date +%u) -eq 1 ]; then  # 周一全量备份
    BACKUP_TYPE="full"
    BACKUP_DIR="weekly_$(date +%Y%m%d)"
else  # 其他天增量备份
    BACKUP_TYPE="incremental" 
    BACKUP_DIR="daily_$(date +%Y%m%d)"
fi

echo "$(date): 开始$BACKUP_TYPE备份" >> $LOG

if [ "$BACKUP_TYPE" = "full" ]; then
    rsync -av --delete $SOURCE $REMOTE/$BACKUP_DIR/ >> $LOG 2>&1
else
    # 查找最新的全量备份作为基准
    LATEST_FULL=$(ssh user@backup-server "ls -td /backup/weekly_* | head -1")

    rsync -av --link-dest=$LATEST_FULL $SOURCE $REMOTE/$BACKUP_DIR/ >> $LOG 2>&1
fi

if [ $? -eq 0 ]; then
    echo "$(date): $BACKUP_TYPE备份成功" >> $LOG
else
    echo "$(date): 错误:$BACKUP_TYPE备份失败" >> $LOG
    # 发送报警邮件
    echo "备份失败" | mail -s "备份报警" admin@company.com
fi

六、实用技巧和故障排除

6.1 压缩传输技巧

# 边压缩边传输(节省临时空间)
tar -czf - /big_directory | ssh user@host "cat > backup.tar.gz"

# 从远程解压到本地
ssh user@host "tar -czf - /remote/data" | tar -xzf - -C /local/

# 网络中断续传
rsync -avP --partial user@host:/bigfile.iso ./

6.2 性能优化

# 使用快速压缩级别
tar -czf -1 backup.tar.gz data/        # 快速压缩

# 并行压缩大文件
pigz -9 bigfile.img                   # 多线程gzip
pbzip2 -9 large_file.bin             # 多线程bzip2

# 网络带宽优化
scp -l 1000 bigfile user@host:/path   # 限制带宽
rsync --bwlimit=50000 large_dir/ user@host:/backup/

6.3 安全注意事项

# 使用SSH密钥认证
scp -i ~/.ssh/id_rsa file user@host:/path

# 敏感文件加密压缩
zip -e sensitive.zip confidential.doc
tar -czf - secret_files/ | openssl enc -aes-256-cbc -out backup.tar.gz.enc

# 安全传输后删除本地副本
shred -u sensitive_file.txt

通过本教程的学习,你应该能够熟练使用Linux下的各种压缩工具和远程传输命令,根据不同的场景选择最合适的工具组合。

作者:严锋  创建时间:2025-11-01 10:59
最后编辑:严锋  更新时间:2025-11-04 14:01