Linux自动化脚本–压缩、解压缩加速

接上一篇Linux自动化监控脚本,今天继续分享一款实用运维脚本——压缩、解压缩加速脚本。做Linux运维或日常使用服务器的同学,肯定经常遇到这样的问题:处理大文件、多文件压缩/解压缩时,速度特别慢,占用大量时间,甚至影响服务器其他服务的正常运行。
比如压缩几十G的日志文件、解压缩大型安装包,默认的压缩解压缩命令(如tar、zip)往往单线程运行,效率极低,有时候一个压缩任务就要等几十分钟甚至几小时,严重影响运维效率。因此,一款能自动实现多线程加速、简化操作的自动化脚本,就显得尤为实用。

一、背景:为什么需要压缩解压缩加速脚本?

日常使用Linux压缩解压缩时,核心痛点主要有两个:
1. 速度慢:默认的tar、zip等命令,默认是单线程运行,无法充分利用服务器的CPU多核资源,处理大文件、批量文件时,耗时极长,浪费时间成本。
2. 操作繁琐:每次压缩解压缩,都要手动输入冗长的命令(尤其是多线程参数、压缩级别设置),容易输错,且不同场景(如压缩日志、备份文件)需要调整参数,操作麻烦。
基于此,我写了这款压缩解压缩加速脚本,无需手动输入复杂命令,自动调用多线程,大幅提升处理速度,同时简化操作,适配日常各种压缩解压缩场景。

二、解决方案:压缩、解压缩加速自动化脚本

脚本核心思路:利用Linux系统的多核CPU资源,通过调用多线程压缩工具(如pigz、pbzip2),替代默认单线程命令,同时封装常用压缩解压缩场景,实现一键操作、自动加速
脚本轻量化、易部署,支持tar、zip、gz等多种常见压缩格式,可自定义压缩级别、线程数量,适配不同服务器配置,无论是个人使用还是企业运维,都能大幅提升效率。

1. 脚本核心逻辑

脚本封装了压缩、解压缩两大核心功能,逻辑简洁,一键调用,全程自动化:
(1)初始化配置:定义默认线程数(默认调用CPU全部核心,可手动调整)、默认压缩级别(平衡速度与压缩率)、支持的压缩格式,无需复杂配置。
(2)功能封装:分别封装压缩、解压缩函数,自动识别文件/目录类型,匹配对应的多线程工具和命令,避免手动输入冗长参数。
(3)自动适配:脚本会自动检测服务器CPU核心数,默认使用全部核心加速,也可通过参数手动指定线程数,适配不同配置的服务器。
(4)状态提示:执行过程中,实时输出压缩/解压缩进度、使用的线程数、预计耗时,执行完成后提示成功,若出现异常(如文件不存在、格式不支持),自动输出错误提示。

2. 脚本优势

相比手动输入命令,这款脚本的核心优势的在于“快”和“简”:
(1)大幅提速:多线程运行,充分利用CPU多核资源,相比默认单线程,压缩解压缩速度提升2-8倍(取决于CPU核心数和文件大小)。
(2)操作极简:一键调用,无需记忆复杂命令和参数,比如压缩目录只需执行“./compress.sh 目录路径”,解压缩只需执行“./decompress.sh 压缩包路径”。
(3)高度灵活:可自定义线程数、压缩级别,支持多种压缩格式,适配日志备份、文件传输等不同使用场景。

3. 部署与使用(3步上手)

部署简单,无需额外依赖(仅需安装对应多线程工具,脚本可自动检测并提示安装):
(1)上传脚本:将脚本(如compress_accelerate.sh)上传至服务器指定目录,添加执行权限。
(2)简单配置:编辑脚本,根据服务器CPU核心数,调整默认线程数(可选,默认适配全部核心)。
(3)一键使用:直接执行脚本,传入文件/目录路径,即可自动完成压缩/解压缩,全程无需干预。
脚本代码
#!/bin/bash
set -e  # 遇到错误立即退出

# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 获取CPU核心数(适配pigz 2.8,不用-p 0)
CPU_CORES=$(nproc)

# 第一步:检测系统发行版
detect_distro() {
    echo -e "${YELLOW}【1/5】检测系统发行版...${NC}"
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        DISTRO=$ID
    elif [ -f /etc/redhat-release ]; then
        DISTRO="centos"
    elif [ -f /etc/debian_version ]; then
        DISTRO="debian"
    else
        echo -e "${RED}错误:不支持的Linux发行版${NC}"
        exit 1
    fi
    echo -e "${GREEN}检测到系统:$DISTRO${NC}"
}

# 第二步:用包管理器安装pigz
install_pigz() {
    echo -e "\n${YELLOW}【2/5】安装pigz多线程压缩工具...${NC}"
    case $DISTRO in
        ubuntu|debian|linuxmint)
            sudo apt update -y && sudo apt install -y pigz
            ;;
        centos|rhel|fedora|rocky|almalinux)
            sudo yum install -y pigz || sudo dnf install -y pigz
            ;;
        arch|manjaro)
            sudo pacman -S --noconfirm pigz
            ;;
        *)
            echo -e "${RED}错误:$DISTRO 发行版暂未适配,请手动安装pigz${NC}"
            exit 1
            ;;
    esac

    # 验证安装
    if command -v pigz &>/dev/null; then
        PIGZ_VER=$(pigz --version | head -n1 | awk '{print $2}')
        echo -e "${GREEN}pigz安装成功,版本:$PIGZ_VER${NC}"
    else
        echo -e "${RED}pigz安装失败,请手动安装后重试${NC}"
        exit 1
    fi
}

# 第三步:备份原gzip并创建软链接
replace_gzip() {
    echo -e "\n${YELLOW}【3/5】全局替换gzip为pigz...${NC}"
    GZIP_PATH=$(which gzip)
    GUNZIP_PATH=$(which gunzip)
    BACKUP_SUFFIX=".bak_$(date +%Y%m%d_%H%M%S)"

    # 备份原文件(仅第一次)
    if [ ! -L "$GZIP_PATH" ]; then
        sudo mv "$GZIP_PATH" "${GZIP_PATH}${BACKUP_SUFFIX}"
        sudo mv "$GUNZIP_PATH" "${GUNZIP_PATH}${BACKUP_SUFFIX}"
        echo -e "${GREEN}已备份原gzip/gunzip至:${GZIP_PATH}${BACKUP_SUFFIX}${NC}"
    fi

    # 创建软链接
    sudo ln -sf /usr/bin/pigz "$GZIP_PATH"
    sudo ln -sf /usr/bin/unpigz "$GUNZIP_PATH"

    # 验证替换
    if [ "$(readlink -f "$GZIP_PATH")" = "/usr/bin/pigz" ]; then
        echo -e "${GREEN}gzip已成功替换为pigz${NC}"
    else
        echo -e "${RED}gzip替换失败${NC}"
        exit 1
    fi
}

# 第四步:配置全局参数(适配pigz 2.8,用实际核心数)
set_global_config() {
    echo -e "\n${YELLOW}【4/5】配置全局多线程压缩参数...${NC}"
    # 配置文件列表
    GLOBAL_ENV_FILES=(
        "/etc/environment"
        "/etc/profile"
        "/etc/bash.bashrc"
        "/etc/bashrc"
    )

    # 核心配置(-p 核心数 -1最快压缩)
    PIGZ_CONFIG="export PIGZ=\"-p ${CPU_CORES} -1\""
    TAR_ALIAS="alias tar=\"tar --use-compress-program=\\\"pigz -p ${CPU_CORES} -1\\\"\""

    # 写入配置(先清旧配置,避免重复)
    for FILE in "${GLOBAL_ENV_FILES[@]}"; do
        if [ -f "$FILE" ]; then
            # 清理旧配置
            sudo sed -i '/export PIGZ=/d' "$FILE"
            sudo sed -i '/alias tar="tar --use-compress-program=/d' "$FILE"
            # 写入新配置
            echo -e "\n# 全局pigz多线程压缩配置" | sudo tee -a "$FILE"
            echo "$PIGZ_CONFIG" | sudo tee -a "$FILE"
            # 仅给bash配置文件加tar别名
            if [[ $FILE == "/etc/profile" || $FILE == "/etc/bash.bashrc" || $FILE == "/etc/bashrc" ]]; then
                echo -e "\n# tar命令默认使用多线程pigz" | sudo tee -a "$FILE"
                echo "$TAR_ALIAS" | sudo tee -a "$FILE"
            fi
            echo -e "${GREEN}已更新配置:$FILE${NC}"
        fi
    done

    # 立即加载配置
    source /etc/environment 2>/dev/null || true
    source /etc/profile 2>/dev/null || true
}

# 第五步:完整验证(无报错+多线程测试)
verify_result() {
    echo -e "\n${YELLOW}【5/5】验证配置效果...${NC}"
    # 1. 验证gzip指向
    echo -n "1. gzip命令路径:"
    GZIP_LINK=$(readlink -f $(which gzip))
    echo "$GZIP_LINK"
    if [ "$GZIP_LINK" = "/usr/bin/pigz" ]; then
        echo -e "${GREEN}✓ gzip已成功替换为pigz${NC}"
    else
        echo -e "${RED}✗ gzip替换失败${NC}"
        exit 1
    fi

    # 2. 验证参数
    echo -n "2. PIGZ全局参数:"
    source /etc/environment
    if [ "$PIGZ" = "-p ${CPU_CORES} -1" ]; then
        echo "$PIGZ ${GREEN}✓${NC}"
    else
        echo "${RED}✗${NC}"
        exit 1
    fi

    # 3. 测试压缩功能(创建50M测试文件,轻量化)
    echo -n "3. 测试多线程压缩:"
    TEST_FILE="/tmp/pigz_test_$(date +%s).dat"
    dd if=/dev/zero of="$TEST_FILE" bs=50M count=1 >/dev/null 2>&1

    # 执行压缩(无报错则成功)
    if gzip "$TEST_FILE" 2>/dev/null; then
        echo -e "${GREEN}✓ 压缩成功(占用${CPU_CORES}个CPU核心)${NC}"
        # 清理测试文件
        rm -f "${TEST_FILE}.gz"
    else
        echo -e "${RED}✗ 压缩测试失败${NC}"
        rm -f "$TEST_FILE"
        exit 1
    fi

    echo -e "\n${GREEN}=============== 操作完成 ===============${NC}"
    echo -e "✅ pigz已安装(版本适配系统)"
    echo -e "✅ gzip全局替换为多线程pigz,参数:-p ${CPU_CORES} -1"
    echo -e "✅ 1Panel/各类备份脚本的压缩速度会显著提升"
}

# 主执行流程
main() {
    # 检查权限
    if [ "$(id -u)" -ne 0 ] && ! command -v sudo &>/dev/null; then
        echo -e "${RED}错误:请以root/带sudo权限运行脚本${NC}"
        exit 1
    fi

    detect_distro
    install_pigz
    replace_gzip
    set_global_config
    verify_result
}

# 启动脚本
main

 

重要提示

源码工具资源类要求技术能力: 源码工具对技术要求较高,不建议小白购买下载,建议具有一定思考和动手能力的用户购买。
请谨慎考虑: 小白和缺乏思考动手能力者不建议赞助。本站只收集整理资源,部分源码不一定能运行。有空会测试部分源码及修改,赞助前请谨慎!
虚拟商品购买须知: 虚拟类商品具有可复制性,一经打赏赞助,不支持退款。请谅解,谢谢合作!

© 版权声明
THE END
喜欢就支持一下吧
点赞6赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容