使用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
相关产品推荐
相关产品推荐

