Mac端Zsh脚本实现:右键父文件夹批量合并子文件夹图片为PDF
批量将子文件夹内图片合并为同名PDF(Mac zsh环境)
问题背景
原本在Windows使用批处理脚本,右键单个文件夹即可将其中png、jpg、tif格式图片合并为与文件夹同名的PDF,但文件夹数量众多时逐个操作效率极低。切换到Mac系统使用zsh后,希望实现右键父文件夹时自动遍历所有嵌套子文件夹,将每个子文件夹内的对应格式图片合并为以该子文件夹命名的PDF。
原脚本问题分析
你提供的bash脚本存在以下几个导致失败的问题:
- 仅处理
.jpg格式,未覆盖需求中的png、tif - 使用
find | while read处理带空格的目录/文件名时会出错 - 生成临时PDF再用Ghostscript合并的流程冗余,且未处理图片排序(合并后的PDF页面顺序可能混乱)
- 会遍历并处理父目录本身,不符合“仅处理子文件夹”的需求
可行解决方案
以下是适配zsh环境的优化脚本,无需临时文件,支持多格式图片、空格路径,且能保证图片按文件名排序:
1. 前置依赖安装
首先确保已安装ImageMagick(提供convert命令):
brew install imagemagick
2. 批量合并脚本
创建名为batch-images-to-pdf.zsh的文件,内容如下:
#!/usr/bin/env zsh # 处理输入目录:若未传参则用当前目录,否则用第一个参数 input_dir=${1:-./} # 遍历所有嵌套子文件夹(排除父目录本身) find "$input_dir" -type d -mindepth 1 | while IFS= read -r dir; do # 获取文件夹名称作为PDF文件名 folder_name=$(basename "$dir") output_pdf="${dir}/${folder_name}.pdf" # 收集当前文件夹内的png/jpg/tif文件,按文件名排序 image_files=(${(f)"$(find "$dir" -maxdepth 1 -type f -iname '*.png' -o -iname '*.jpg' -o -iname '*.tif' | sort)"}) # 如果存在图片文件,才执行合并 if [[ ${#image_files[@]} -gt 0 ]]; then echo "正在处理文件夹: $dir" # 使用convert直接将图片合并为PDF,保持排序 convert "${image_files[@]}" "$output_pdf" echo "已生成PDF: $output_pdf" else echo "文件夹 $dir 中无符合格式的图片,跳过" fi done echo "所有文件夹处理完成"
3. 脚本使用方法
- 给脚本添加执行权限:
chmod +x batch-images-to-pdf.zsh - 直接运行(处理当前目录下的子文件夹):
./batch-images-to-pdf.zsh - 指定父文件夹路径运行:
./batch-images-to-pdf.zsh "/Users/xxx/你的父文件夹路径"
4. 右键快捷方式设置(可选)
如果需要实现右键父文件夹直接触发:
- 打开「Automator」,新建「快速操作」
- 选择「工作流程收到」为「文件夹」,位于「Finder」
- 添加「运行Shell脚本」动作,将Shell改为
/bin/zsh,输入内容:/Users/xxx/你的脚本路径/batch-images-to-pdf.zsh "$@" - 保存为「批量图片转PDF」,之后在Finder中右键文件夹即可看到该选项
内容的提问来源于stack exchange,提问作者user10714785
相关产品推荐
相关产品推荐

