如何通过IF/FOR语句实现Bash图片预处理的关键词匹配
批量图片预处理与拼接的Shell脚本实现方案
需求背景
我正在对同一文件夹${vizu}中的图片做后处理,原本用以下命令拼接所有含chicont关键词的图片:
# 拼接所有名称含chicont关键词的图片 montage "${vizu}"/*chicont*.png -geometry 1200 -tile x"${rows}"e -mattecolor DarkGoldenrod2 -mode Frame "${vizu}"/${prot}_chimcont_rep${i}.png
现在需要给部分图片先执行预处理:
convert "${vizu}"/${some_keyword}*chicont*.png -distort BarrelInverse 3:30 "${vizu}"/${some_keyword}_chimcont_DISTORTED.png
核心需求:通过IF/FOR语句实现关键词列表的匹配,对指定图片执行预处理后,再用montage拼接所有图片(含处理后和未处理的)。
方法一:遍历关键词列表(推荐)
直接遍历预先定义的关键词数组,对每个关键词匹配的图片批量执行预处理,逻辑清晰且高效:
#!/bin/bash # 1. 定义需要预处理的关键词数组(普通数组足够,无需关联数组) keywords=("some_keyword1" "some_keyword2" "some_keyword3") # 2. 遍历每个关键词,执行convert预处理 for keyword in "${keywords[@]}"; do # 匹配当前关键词开头、包含chicont的图片,批量处理 convert "${vizu}"/${keyword}*chicont*.png -distort BarrelInverse 3:30 "${vizu}"/${keyword}_chimcont_DISTORTED.png done # 3. 执行最终拼接:包含原chicont图片和预处理后的图片 montage "${vizu}"/*chicont*.png "${vizu}"/*_chimcont_DISTORTED.png -geometry 1200 -tile x"${rows}"e -mattecolor DarkGoldenrod2 -mode Frame "${vizu}"/${prot}_chimcont_rep${i}.png
关键说明
- 用普通数组存储关键词,比关联数组更适配当前场景(无需键值对映射)
- 预处理后的图片命名带
_DISTORTED后缀,避免与原文件冲突 - 最终
montage命令同时包含原文件和处理后文件,确保所有目标图片被拼接
方法二:遍历图片并判断关键词匹配
如果需要先遍历所有chicont图片,再判断是否属于关键词列表,可采用此方式:
#!/bin/bash # 1. 定义关键词数组 keywords=("some_keyword1" "some_keyword2" "some_keyword3") # 2. 遍历所有含chicont的图片 for img in "${vizu}"/*chicont*.png; do # 提取纯文件名(去除路径) filename=$(basename "$img") # 检查文件名是否包含任意一个目标关键词 for keyword in "${keywords[@]}"; do if [[ "$filename" == *"$keyword"* ]]; then # 执行预处理,输出文件带关键词标识 convert "$img" -distort BarrelInverse 3:30 "${vizu}"/${keyword}_chimcont_DISTORTED.png break # 匹配到关键词后立即跳出,避免重复处理 fi done done # 3. 执行最终拼接 montage "${vizu}"/*chicont*.png "${vizu}"/*_chimcont_DISTORTED.png -geometry 1200 -tile x"${rows}"e -mattecolor DarkGoldenrod2 -mode Frame "${vizu}"/${prot}_chimcont_rep${i}.png
关键说明
- 用
basename提取文件名,避免路径干扰关键词匹配逻辑 - 内层循环匹配到关键词后立即跳出,防止同一图片被多个关键词重复处理
注意事项
- 若原图片预处理后无需保留,可在
convert命令后添加rm "$img"删除原文件,但建议先备份再操作 - 确保已安装
ImageMagick工具(montage和convert均为其内置命令) - 若关键词包含特殊字符,需给变量添加双引号(如
"${keyword}"),避免通配符解析错误
内容的提问来源于stack exchange,提问作者James Starlight
相关产品推荐
相关产品推荐

