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
微信
支付宝