如何将文件名包含负数的静态图像序列转换为GIF动画或视频
问题解决方法
你遇到的排序错误是两个原因共同导致的:
- Bash默认通配符
*.pgm遍历文件时按词典序排序,无法识别实数值的大小 - 你当前使用的
pl_PL.UTF-8locale对负数的数值排序规则不符合预期
修正方案
方案1:遍历文件时直接按数值顺序处理,生成有序的序号命名gif
将你之前处理pgm转gif的循环替换为以下代码:
i=0 # 临时指定C locale保证数值排序正确,sort -g支持浮点数、负数的数值排序 while IFS= read -r file; do # 跳过异常空输入 [ -f "$file" ] || continue b=$(basename "$file" .pgm) convert "$file" -pointsize 50 -annotate +10+100 "${b:0:4}" "${i}.gif" echo "已处理:$file" i=$((i + 1)) done < <(LC_COLLATE=C ls *.pgm | sort -g)
后续生成动图的命令不需要修改,直接用:
convert *.gif -resize 600x600 a600_100.gif
方案2:不修改转换逻辑,仅在生成动图时指定文件顺序
如果你不想修改pgm转gif的原有逻辑,可以直接在生成动图的步骤指定正确的文件顺序:
# 过滤非数值命名的gif文件,按数值排序后传入convert convert $(LC_COLLATE=C ls *.gif | grep -E '^-?[0-9]+\.[0-9]+\.gif$' | sort -g) -resize 600x600 a600_100.gif
相关说明
LC_COLLATE=C指定使用标准ASCII排序规则,规避locale自定义排序带来的异常sort -g是通用数值排序,对浮点数、负数的支持比默认的sort -n兼容性更好- 所有变量外添加双引号,避免文件名含特殊字符时命令执行异常
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

