首先,如果我理解正确,这个要求:
对于遇到的每个子目录,将指定扩展名的所有文件转换为名为 $NameOfDirectory$.PDF 的单个 PDF
是不明智的。如果这意味着,比如说,a/b/c/*.cpp
被写入./c.pdf
,那么如果你也有,那么你就完蛋了a/d/x/c/*.cpp
,因为两个目录的内容都映射到同一个 PDF。这也意味着*.cpp
(即当前目录中的 CPP 文件)被写入名为./..pdf
.
像这样的东西,它根据所需的扩展名命名 PDF 并将其放在每个子目录中与其源文件一起,没有这些问题:
#!/usr/bin/env bash
# USAGE: ext2pdf [<ext> [<root_dir>]]
# DEFAULTS: <ext> = cpp
# <root_dir> = .
ext="${1:-cpp}"
rootdir="${2:-.}"
shopt -s nullglob
find "$rootdir" -type d | while read d; do
# With "nullglob", this loop only runs if any $d/*.$ext files exist
for f in "$d"/*.${ext}; do
out="$d/$ext".pdf
# NOTE: Uncomment the following line instead if you want to risk name collisions
#out="${rootdir}/$(basename "$d")".pdf
enscript -Ecpp -MLetter -fCourier8 -o - "$d"/*.${ext} | ps2pdf - "$out"
break # We only want this to run once
done
done