基于ImageMagick合并分块图片及find命令语法问题求助
问题解决与优化建议
1. 修复find命令的语法错误
你当前的find命令语法不符合规范,-print与后续命令调用的位置逻辑错误,执行外部命令需使用-exec选项,或结合xargs实现并行处理:
基础串行执行写法
find "tiled_images" -type d -exec ./processOne {} \;
\;表示为每个找到的文件夹单独调用一次processOne脚本。
并行执行写法(推荐)
如果要实现并行处理,用xargs配合-P参数指定并行进程数(示例设为8,可根据CPU核心数调整):
find "tiled_images" -type d -print0 | xargs -0 -P 8 -I {} ./processOne {}
-print0和-0:兼容带空格/特殊字符的文件夹名,避免解析出错-P 8:设置同时运行的进程数量-I {}:用找到的文件夹路径替换占位符{}
2. 优化图片列表获取逻辑
你当前的row=( $(ls | egrep *-y${y}-z 2> /dev/null) )存在两个问题:
egrep的匹配模式未加引号,会被Shell意外展开导致结果错误- 依赖
ls配合管道处理文件名,遇到含空格/特殊字符的文件会出现异常
改成更可靠的Shell glob匹配:
row=( *-y"${y}"-z* )
如果需要按x坐标排序(确保小图从左到右排列正确),可补充排序逻辑:
# 假设文件名格式为x{数字}-y{数字}-z...,提取x坐标并排序 row=( $(printf "%s\n" *-y"${y}"-z* | sort -n -k1,1 -t'-') )
3. ImageMagick合并分块图的核心脚本示例
针对每个文件夹内的512x512分块图,按xy坐标拼接成完整大图的processOne脚本核心逻辑:
#!/bin/bash cd "$1" || exit 1 # 获取所有y坐标值并去重排序 y_coords=( $(printf "%s\n" *-y*-z* | sed -E 's/.*-y([0-9]+)-z.*/\1/' | sort -n | uniq) ) # 创建临时目录存放每行拼接结果,脚本退出时自动清理 temp_dir=$(mktemp -d) trap 'rm -rf "$temp_dir"' EXIT # 按y坐标横向拼接每行图片 for y in "${y_coords[@]}"; do row_imgs=( $(printf "%s\n" *-y"${y}"-z* | sort -n -k1,1 -t'-') ) convert +append "${row_imgs[@]}" "$temp_dir/row_$y.png" done # 纵向拼接所有行得到完整大图 convert -append "$temp_dir"/row_*.png "../$(basename "$1")_full.png"
convert +append:横向拼接同y坐标的小图convert -append:纵向拼接所有行图得到完整大图trap:确保脚本异常退出时也能清理临时文件
内容的提问来源于stack exchange,提问作者mpt38
相关产品推荐
相关产品推荐

