如何编写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
相关产品推荐
相关产品推荐

