You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 右键快捷方式设置(可选)

如果需要实现右键父文件夹直接触发:

  1. 打开「Automator」,新建「快速操作」
  2. 选择「工作流程收到」为「文件夹」,位于「Finder」
  3. 添加「运行Shell脚本」动作,将Shell改为/bin/zsh,输入内容:
    /Users/xxx/你的脚本路径/batch-images-to-pdf.zsh "$@"
    
  4. 保存为「批量图片转PDF」,之后在Finder中右键文件夹即可看到该选项

内容的提问来源于stack exchange,提问作者user10714785

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:05:55