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

如何编写Bash循环脚本按类批量调用程序处理PNG文件

Bash脚本按文件名末尾类别分组处理PNG文件

要实现按文件名末尾的类别分组调用程序,核心思路是先提取所有唯一的类别,再循环每个类别匹配对应文件并传递给目标程序。下面分步骤给你讲解并提供可直接调整的脚本:

1. 先明确文件名格式,调整类别提取逻辑

首先得对应你的实际文件名格式来提取类别:

  • 比如文件名是photo_summer.png、pic_winter.png(下划线分隔类别),用${base##*_}提取最后一个下划线后的内容;
  • 如果是report-2024-Q3.png(连字符分隔),就改成${base##*-};
  • 如果类别是文件名最后N个字符(比如img01AB.png里的AB),用cat=${base: -2}(这里2是类别字符数)。

2. 完整脚本示例(处理带空格的文件名也没问题)

#!/bin/bash

# 定义你的目标程序路径,替换成实际程序名/路径
TARGET_PROGRAM="your_program_here"

# 用关联数组存储唯一类别,避免重复
declare -A unique_categories

# 遍历所有PNG文件,提取类别
for file in *.png; do
    # 跳过非文件(比如没有PNG时的*.png通配符本身)
    [[ -f "$file" ]] || continue
    
    # 去掉.png后缀
    filename_without_ext="${file%.png}"
    # 提取类别:这里用下划线分隔,根据你的格式调整!
    category="${filename_without_ext##*_}"
    
    # 将类别存入关联数组(自动去重)
    unique_categories["$category"]=1
done

# 循环每个唯一类别,处理对应文件
for category in "${!unique_categories[@]}"; do
    # 匹配当前类别的所有PNG文件,存入数组(支持带空格的文件名)
    matching_files=(*_"$category".png)
    
    # 检查是否有实际文件(避免空匹配)
    if [[ ${#matching_files[@]} -gt 0 && -f "${matching_files[0]}" ]]; then
        echo "=== 处理类别: $category ==="
        echo "待处理文件: ${matching_files[*]}"
        # 调用目标程序,传递所有匹配文件
        "$TARGET_PROGRAM" "${matching_files[@]}"
    fi
done

3. 关键细节说明

  • 关联数组unique_categories:用来自动去重类别,确保每个类别只处理一次;
  • 数组存储匹配文件:matching_files=(*_"$category".png)用通配符匹配文件并存入数组,能正确处理文件名含空格的情况;
  • 参数传递方式:"${matching_files[@]}"会把每个文件作为单独的参数传给程序,避免空格导致的参数拆分错误;
  • 错误防护:加入了[[ -f "$file" ]]和文件数量检查,避免没有PNG文件或空匹配时的报错。

4. 自定义调整要点

  • 修改TARGET_PROGRAM为你实际要调用的程序;
  • 调整category="${filename_without_ext##*_}"这一行的类别提取逻辑,匹配你的文件名格式;
  • 如果匹配文件的通配符需要调整(比如*_"$category".png改成*-"$category".png),同步修改matching_files的赋值语句。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:17:38