You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Bash脚本用jpeg2txt处理目录上传的JPEG文件?

基于Bash实现JPEG文件自动处理守护进程脚本

核心问题解答

  1. 守护进程 vs Cron:确实用后台循环的守护进程脚本更合适。Cron每分钟触发会导致多实例并行处理同一批文件,而守护进程可以自主控制检查间隔,避免重复执行,还能实时响应新文件。
  2. 避免处理未完成上传的文件:最实用的方法是尝试重命名文件——FTP上传中的文件会被进程锁定,无法完成重命名,以此判断文件是否上传完成;也可搭配检查文件修改时间,确保文件在一段时间内没有变动。

完整脚本实现

#!/bin/bash

# 配置参数
SOURCE_DIR="/path/to/your/source"
TARGET_DIR="/path/to/your/target"
SLEEP_INTERVAL=10  # 每次检查间隔(秒)
WAIT_STABLE_TIME=5 # 文件修改后等待稳定的时间(可选)

# 确保目标目录存在
mkdir -p "$TARGET_DIR"

# 持续循环检查
while true; do
    # 遍历源目录下的JPEG文件(兼容.jpg/.jpeg)
    for img in "$SOURCE_DIR"/*.{jpg,jpeg} 2>/dev/null; do
        # 跳过不存在的文件(目录无JPEG时通配符会保留原样)
        [ -f "$img" ] || continue

        # 步骤1:尝试重命名文件,判断是否被占用
        temp_file="$SOURCE_DIR/.processing_$(basename "$img")"
        if ! mv "$img" "$temp_file"; then
            # 重命名失败,说明文件正在上传,跳过
            continue
        fi

        # 步骤2(可选):等待文件修改时间稳定,确保上传完成
        while [ $(( $(date +%s) - $(stat -c %Y "$temp_file") )) -lt "$WAIT_STABLE_TIME" ]; do
            sleep 1
        done

        # 生成输出文件名(去掉原后缀,改为.txt)
        base_name=$(basename "$temp_file" | sed 's/\.processing_//' | sed 's/\.[^.]*$//')
        output_file="$TARGET_DIR/$base_name.txt"

        # 步骤3:执行jpeg2txt处理
        if jpeg2txt "$temp_file" > "$output_file"; then
            # 处理成功,删除临时文件
            rm "$temp_file"
            echo "$(date '+%Y-%m-%d %H:%M:%S') 处理完成:$img -> $output_file"
        else
            # 处理失败,恢复原文件,留待下次重试
            mv "$temp_file" "$img"
            echo "$(date '+%Y-%m-%d %H:%M:%S') 处理失败,恢复原文件:$img"
        fi
    done

    # 等待下一次检查
    sleep "$SLEEP_INTERVAL"
done

脚本关键逻辑说明

  1. 文件占用判断:通过mv命令尝试将原文件重命名为临时文件,若失败则说明文件正被FTP进程占用,直接跳过。这是最可靠的轻量判断方式。
  2. 文件稳定检查:可选的等待逻辑,确保文件修改时间在WAIT_STABLE_TIME秒内没有变化,进一步避免处理未完全上传的文件。
  3. 错误恢复:如果jpeg2txt处理失败,会将临时文件恢复为原名称,避免丢失待处理文件。
  4. 空格兼容:所有路径变量都用双引号包裹,支持带空格的文件名和目录。

脚本运行与管理

后台启动脚本

# 赋予执行权限
chmod +x ./jpeg_processor.sh

# 后台运行,退出终端后仍保持运行
nohup ./jpeg_processor.sh > ./processor.log 2>&1 &

配置为系统服务(推荐)

创建/etc/systemd/system/jpeg-processor.service文件:

[Unit]
Description=JPEG to Text Auto Processor
After=network.target

[Service]
User=your_username
ExecStart=/path/to/your/jpeg_processor.sh
Restart=always
RestartSec=5
StandardOutput=append:/var/log/jpeg-processor.log
StandardError=append:/var/log/jpeg-processor.log

[Install]
WantedBy=multi-user.target

然后执行以下命令启用服务:

sudo systemctl daemon-reload
sudo systemctl enable --now jpeg-processor.service

# 查看服务状态
sudo systemctl status jpeg-processor.service

内容的提问来源于stack exchange,提问作者Leszek Pachura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:55:00