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

使用gs结合ls命令合并PDF时出现/undefinedfilename错误求助

解决ZSH中Ghostscript合并PDF命令因文件名空格失效的问题

问题根源

你的命令失效是因为文件名包含空格时,$(ls -t | tail -r)的输出会被ZSH按空格拆分成多个独立参数,Ghostscript会把这些拆分后的片段当成单独的文件名,比如The File.pdf会被拆成The和File.pdf,自然找不到名为The的文件,从而报错。

解决方案

推荐两种更可靠的方式,都能正确处理带空格的文件名:

方案1:用ZSH内置Glob排序(最简洁)

直接利用ZSH的glob扩展按修改时间排序,无需调用ls,自动处理空格:

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=merged.pdf *.pdf(om)
  • *.pdf匹配所有PDF文件
  • (om)是ZSH的glob修饰符:o表示升序排序,m表示按修改时间排序(对应下载顺序,先下载的文件修改时间更早),正好满足你"先下载的先合并"的需求。

方案2:用数组保存文件名(兼容原有逻辑)

如果坚持使用ls -t | tail -r的排序逻辑,把输出存入数组后再传递给Ghostscript,确保每个文件名作为独立参数:

# 读取排序后的文件名到数组
files=()
while IFS= read -r line; do
  files+=("$line")
done < <(ls -t | tail -r)

# 执行合并命令
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=merged.pdf "${files[@]}"
  • IFS= read -r line确保读取完整的文件名(包括空格)
  • "${files[@]}"展开数组时会保留每个文件名的完整性,不会被空格拆分。

验证

执行上述命令前,可以先打印数组内容确认顺序和文件名完整性:

print -l "${files[@]}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:42:36