如何编写通用Bash脚本 递归匹配多格式图片调用ImageMagick转PDF
多格式图片递归转Kindle适配PDF通用Bash脚本
实现逻辑说明
原脚本存在两个核心问题:一是通配符匹配默认大小写敏感,无法覆盖大写后缀的图片;二是直接拼接通配符无法同时匹配多类后缀,也未处理文件名排序、带空格路径兼容的问题,容易出现页序错乱、路径报错的情况。
通用脚本实现以下特性:
- 自动匹配所有
.jpg/.jpeg/.png后缀的图片,完全不区分大小写 - 自动按文件名自然排序,保证漫画页码顺序正确
- 兼容带空格、特殊字符的目录与文件名
- 保持原有逻辑:按目录为单位生成PDF,输出路径与原目录结构对应
- 自动跳过无图片的空目录,不会生成无效空文件
完整脚本代码
#!/bin/bash # 开启bash扩展匹配:不区分大小写匹配文件、无匹配时返回空值 shopt -s nullglob nocaseglob root_dir="$(pwd)" echo "工作根目录: $root_dir" # 先遍历输出所有待处理目录 echo "将按以下顺序处理目录:" find . -type d -print # 逐目录处理图片转PDF find . -type d | while read -r target_dir; do echo "正在处理目录: $target_dir" # 收集当前目录下所有jpg/jpeg/png格式图片 img_files=() for suffix in jpg jpeg png; do img_files+=("$target_dir"/*."$suffix") done # 过滤无效路径,自然排序保证漫画页序正确 mapfile -t sorted_imgs < <(printf "%s\n" "${img_files[@]}" | grep -vE '\*$' | sort -V) # 目录下无对应图片则跳过 if [ ${#sorted_imgs[@]} -eq 0 ]; then echo "目录 $target_dir 无符合要求的图片,跳过" continue fi # 生成输出PDF路径,处理根目录特殊情况 if [ "$target_dir" = "." ]; then output_pdf="$root_dir/根目录图片合集.pdf" else output_pdf="$root_dir/${target_dir#./}.pdf" fi # 自动创建输出路径所需的父目录,避免多级目录报错 mkdir -p "$(dirname "$output_pdf")" # 调用ImageMagick转换 convert "${sorted_imgs[@]}" "$output_pdf" echo "已生成: $output_pdf" done
使用方法
- 将上述代码保存为
img2pdf-kindle.sh,放到存放漫画的根目录下 - 给脚本添加执行权限:
chmod +x img2pdf-kindle.sh - 执行脚本即可:
./img2pdf-kindle.sh
常见问题说明:如果运行时提示convert命令不存在,先确认ImageMagick已正确安装,Debian/Ubuntu系可执行
sudo apt install imagemagick安装;如果遇到PDF转换权限报错,可修改/etc/ImageMagick-6/policy.xml中PDF相关的权限限制,这是ImageMagick默认的安全策略导致的。
内容的提问来源于stack exchange,提问作者Tobi
相关产品推荐
相关产品推荐

