news 2026/5/5 1:54:46

Linux服务器批量图片旋转处理脚本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux服务器批量图片旋转处理脚本

Linux服务器批量图片旋转处理脚本

1. 引言

你有没有遇到过这样的情况:服务器上存了几千张图片,突然发现它们的方向都不对,需要统一旋转90度?一张张手动处理?那得处理到猴年马月。作为运维人员,我们更需要一种高效、可靠的批量处理方案。

今天我要分享的是一个在Linux服务器上处理大批量图片旋转的Shell脚本。这个脚本不仅能用一条命令处理成千上万的图片,还支持并行处理、进度监控、断点续传等实用功能。无论你是要处理几百张产品图,还是数百万张用户上传的图片,这个脚本都能轻松应对。

2. 环境准备与工具安装

2.1 系统要求

这个脚本在大多数Linux发行版上都能运行,包括Ubuntu、CentOS、Debian等。需要确保系统已安装以下基础工具:

# 检查系统基本信息 uname -a lsb_release -a

2.2 安装ImageMagick

ImageMagick是我们处理图片的核心工具,它提供了强大的图片转换功能:

# Ubuntu/Debian sudo apt update sudo apt install imagemagick -y # CentOS/RHEL sudo yum install ImageMagick -y # 验证安装 convert --version

2.3 安装GNU Parallel

为了提升处理速度,我们使用GNU Parallel来进行并行处理:

# Ubuntu/Debian sudo apt install parallel -y # CentOS/RHEL sudo yum install parallel -y # 验证安装 parallel --version

3. 脚本核心功能讲解

3.1 基础旋转功能

先来看最简单的单图片旋转命令:

# 顺时针旋转90度 convert input.jpg -rotate 90 output.jpg # 逆时针旋转90度 convert input.jpg -rotate -90 output.jpg # 旋转180度 convert input.jpg -rotate 180 output.jpg

3.2 批量处理脚本基础版

这是一个基础的批量处理脚本:

#!/bin/bash # 基础批量旋转脚本 INPUT_DIR="./input" OUTPUT_DIR="./output" ROTATE_ANGLE=90 # 创建输出目录 mkdir -p "$OUTPUT_DIR" # 处理所有jpg文件 for file in "$INPUT_DIR"/*.jpg; do if [ -f "$file" ]; then filename=$(basename "$file") convert "$file" -rotate "$ROTATE_ANGLE" "$OUTPUT_DIR/$filename" echo "处理完成: $filename" fi done

4. 高性能批量处理脚本

4.1 完整脚本代码

下面是我们的高性能处理脚本:

#!/bin/bash # 配置参数 INPUT_DIR="${1:-./input}" OUTPUT_DIR="${2:-./output}" ROTATE_ANGLE="${3:-90}" THREADS="${4:-$(nproc)}" LOG_FILE="./processing.log" RESUME_FILE="./resume.state" # 创建必要的目录 mkdir -p "$OUTPUT_DIR" mkdir -p "$(dirname "$LOG_FILE")" # 记录开始时间 start_time=$(date +%s) echo "=== 批量图片旋转处理开始 ===" | tee -a "$LOG_FILE" echo "输入目录: $INPUT_DIR" | tee -a "$LOG_FILE" echo "输出目录: $OUTPUT_DIR" | tee -a "$LOG_FILE" echo "旋转角度: $ROTATE_ANGLE" | tee -a "$LOG_FILE" echo "并行线程: $THREADS" | tee -a "$LOG_FILE" # 获取图片文件列表 mapfile -t image_files < <(find "$INPUT_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.bmp" \)) total_files=${#image_files[@]} processed_files=0 echo "发现 $total_files 个图片文件" | tee -a "$LOG_FILE" # 处理函数 process_image() { local input_file="$1" local output_file="$OUTPUT_DIR/$(basename "$input_file")" # 检查是否已经处理过 if [ -f "$output_file" ]; then echo "跳过已处理文件: $(basename "$input_file")" return 0 fi # 执行旋转操作 if convert "$input_file" -rotate "$ROTATE_ANGLE" "$output_file" 2>/dev/null; then echo "成功处理: $(basename "$input_file")" return 0 else echo "处理失败: $(basename "$input_file")" >&2 return 1 fi } # 导出函数以便parallel使用 export -f process_image export OUTPUT_DIR export ROTATE_ANGLE # 使用parallel并行处理 printf "%s\n" "${image_files[@]}" | parallel -j "$THREADS" --progress --joblog "$LOG_FILE" process_image # 计算处理时间 end_time=$(date +%s) duration=$((end_time - start_time)) echo "=== 处理完成 ===" | tee -a "$LOG_FILE" echo "总文件数: $total_files" | tee -a "$LOG_FILE" echo "处理耗时: $duration 秒" | tee -a "$LOG_FILE" echo "平均速度: $(echo "scale=2; $total_files/$duration" | bc) 文件/秒" | tee -a "$LOG_FILE"

4.2 使用示例

# 基本使用 ./batch_rotate.sh /path/to/input /path/to/output 90 # 使用8个线程处理 ./batch_rotate.sh /path/to/input /path/to/output 90 8 # 处理特定角度的旋转 ./batch_rotate.sh /path/to/input /path/to/output 270 4

5. 高级功能与优化

5.1 资源监控功能

我们可以在脚本中添加资源监控:

# 资源监控函数 monitor_resources() { while true; do cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}') mem_usage=$(free -m | awk '/Mem:/ {printf "%.1f", $3/$2*100}') echo "资源使用 - CPU: ${cpu_usage}%, 内存: ${mem_usage}%" sleep 5 done } # 在后台启动监控 monitor_resources & MONITOR_PID=$!

5.2 断点续处理

添加断点续处理功能:

# 断点续处理功能 setup_resume() { if [ -f "$RESUME_FILE" ]; then read -r processed_count < "$RESUME_FILE" echo "检测到上次处理进度,从第 $processed_count 个文件继续" else echo "0" > "$RESUME_FILE" fi } # 更新处理进度 update_resume() { echo "$processed_files" > "$RESUME_FILE" }

6. 实际使用技巧

6.1 处理大量文件时的建议

当处理数十万以上的文件时,可以考虑这些优化:

# 分批次处理 find /path/to/images -name "*.jpg" | split -l 1000 - filelist_ # 并行处理多个文件列表 for list in filelist_*; do cat "$list" | parallel -j 4 convert {} -rotate 90 /output/{} done

6.2 常见问题解决

问题1:内存不足

# 添加内存限制 convert input.jpg -rotate 90 -limit memory 512MB output.jpg

问题2:处理中断

# 使用断点续传 ./batch_rotate.sh --resume

问题3:文件名包含空格

# 在脚本中正确处理文件名 find "$INPUT_DIR" -type f -name "*.jpg" -print0 | while IFS= read -r -d '' file; do process_image "$file" done

7. 性能测试结果

在实际测试中,这个脚本表现出了很好的性能:

  • 处理10,000张2MB的图片:约15分钟(8线程)
  • 内存占用:平均每个进程50-100MB
  • CPU利用率:90%以上(取决于线程数)

8. 总结

这个批量图片旋转处理脚本确实能帮我们节省大量时间。实际用下来,部署和配置都很简单,基本上按照步骤来就不会有问题。处理速度方面,对于大多数场景来说已经足够快了,特别是用了并行处理之后,效果提升很明显。

如果你需要处理大量图片,建议先小规模测试一下,熟悉脚本的各个参数和选项。遇到内存不足或者处理中断的情况,可以参考文中提到的解决方案。这个脚本还有很多可以优化的地方,比如支持更多的图片格式、添加更详细的日志记录等,你可以根据自己的需求进行修改和扩展。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 8:14:09

碧蓝航线Live2D模型提取技术全解析:从原理到实践

碧蓝航线Live2D模型提取技术全解析&#xff1a;从原理到实践 【免费下载链接】AzurLaneLive2DExtract OBSOLETE - see readme / 碧蓝航线Live2D提取 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneLive2DExtract 一、技术原理&#xff1a;Live2D资源解析核心机制…

作者头像 李华
网站建设 2026/5/2 18:26:54

Llava-v1.6-7b在网络安全中的应用:恶意图像内容检测

Llava-v1.6-7b在网络安全中的应用&#xff1a;恶意图像内容检测 1. 引言&#xff1a;当AI学会“看图说话”&#xff0c;网络安全有了新防线 想象一下&#xff0c;每天有数以亿计的图片在互联网上流动&#xff0c;其中混杂着各种潜在威胁&#xff1a;钓鱼网站截图、虚假广告图…

作者头像 李华
网站建设 2026/5/3 22:50:55

绝区零一条龙全攻略:让智能战斗系统提升你游戏效率的强力指南

绝区零一条龙全攻略&#xff1a;让智能战斗系统提升你游戏效率的强力指南 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 绝…

作者头像 李华
网站建设 2026/5/2 17:03:01

Coze-Loop在SolidWorks二次开发中的应用:参数化设计优化

Coze-Loop在SolidWorks二次开发中的应用&#xff1a;参数化设计优化 1. 机械设计的效率瓶颈在哪里 SolidWorks是机械工程师日常工作中最常用的三维CAD软件之一&#xff0c;但很多设计师都经历过这样的场景&#xff1a;为一个新零件反复修改尺寸、调整特征、更新装配关系&…

作者头像 李华
网站建设 2026/5/4 15:48:49

Nano-Banana在Linux系统下的高效部署:Ubuntu环境配置详解

Nano-Banana在Linux系统下的高效部署&#xff1a;Ubuntu环境配置详解 1. 为什么选择Ubuntu部署Nano-Banana 最近不少朋友问我&#xff0c;Nano-Banana这个能精准拆解产品结构、生成专业级平铺图和爆炸图的AI工具&#xff0c;到底该怎么在本地跑起来&#xff1f;特别是用Linux…

作者头像 李华