Skip to content
Silubaba trade > Blog > news > CentOS 递归遍历所有子目录图片压缩脚本

CentOS 递归遍历所有子目录图片压缩脚本

    CentOS 递归遍历所有子目录图片压缩脚本

    功能:

    1. 递归遍历目标文件夹所有子文件夹
    2. 图片尺寸缩至原图 60%,JPG 质量 70
    3. 原路径直接覆盖,不生成新目录、不移动文件
    4. 支持 jpg/jpeg/png,跳过其它格式
    5. 不备份原图(磁盘紧张专用)

    1. 安装依赖

    bash

    运行

    yum install ImageMagick -y
    

    2. 创建脚本 compress_img.sh

    bash

    运行

    #!/bin/bash
    # 图片递归压缩脚本 - 原图60%尺寸 直接覆盖
    # 支持格式:jpg jpeg png
    # 递归所有子目录,按原路径覆盖保存
    
    # ========== 配置项 修改这里 ==========
    # 图片根目录(改成你的图片总目录绝对路径)
    ROOT_DIR="/data/www/upload"
    # 缩放比例 60%
    SCALE="60%"
    # jpg压缩质量 0-100
    QUALITY=70
    # ======================================
    
    # 判断目录是否存在
    if [ ! -d "${ROOT_DIR}" ];then
        echo "错误:目录 ${ROOT_DIR} 不存在!"
        exit 1
    fi
    
    echo "开始递归扫描并压缩目录:${ROOT_DIR}"
    echo "缩放比例:${SCALE}  画质质量:${QUALITY}"
    echo "=========================================="
    
    # 递归查找所有图片
    find "${ROOT_DIR}" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | while read file; do
        echo "正在处理:${file}"
    
        # 压缩缩放,直接覆盖原文件
        convert "${file}" \
            -resize "${SCALE}" \
            -quality "${QUALITY}" \
            "${file}"
    
        if [ $? -eq 0 ];then
            echo "✅ 处理完成:${file}"
        else
            echo "❌ 处理失败:${file}"
        fi
        echo "----------------------------------------"
    done
    
    echo "全部图片处理完毕!"
    

    3. 使用方法

    1. 修改脚本内 ROOT_DIR="/data/www/upload" 为你的图片根目录
    2. 赋予执行权限

    bash

    运行

    chmod +x compress_img.sh
    
    1. 执行

    bash

    运行

    ./compress_img.sh
    

    关键特性说明

    1. 递归所有子文件夹:多层目录不用手动进子文件夹
    2. 原路覆盖:压缩后直接替换原图片,路径、文件名完全不变
    3. 仅缩小不放大:图片本身小于 60% 尺寸不会拉伸失真
    4. 自动跳过非图片文件
    5. 输出日志,成功 / 失败一目了然

    可选增强(PNG 极致压缩)

    如需 PNG 进一步瘦身,安装工具:

    bash

    运行

    yum install optipng -y
    

    在脚本 done 前添加一段,对 png 二次无损压缩:

    bash

    运行

    # PNG额外无损压缩
    find "${ROOT_DIR}" -type f -iname "*.png" | while read png;do
        optipng -o2 "${png}"
    done
    

    重要提醒

    脚本直接覆盖原图,无法恢复

    建议首次执行前先备份整个图片目录,防止压缩过度模糊。

    Leave a Reply