我正在尝试编写一个 bash 脚本,它使用 Imagemagick 将 PDF 转换为给定目录中的图像(作为参数传递),然后将该转换保存到该目录的子文件夹中。我有一个脚本,可以完美地转换并保存到同一目录中,但是当我尝试添加路径时,我希望将转换后的文件保存在脚本中断处。
这是我到目前为止有效的:
DIR="$@"
EXT="*.pdf"
mkdir -p "${DIR}images"
shopt -s nullglob
for pdffile in "$DIR"*.pdf; do
convert -density 300 -depth 8 -quality 90 -trim "${pdffile}" "${pdffile%.*}".jpeg
done
这是我尝试保存到子文件夹中的内容。如果我将“images/...”添加到转换的最后一个参数中,如下所示:
DIR="$@"
EXT="*.pdf"
mkdir -p "${DIR}images"
shopt -s nullglob
for pdffile in "$DIR"*.pdf; do
convert -density 300 -depth 8 -quality 90 -trim "${pdffile}" "images/${pdffile%.*}".jpeg
done
这是我执行脚本时发生的情况:
$ ls foo
bar.pdf baz.pdf biz.pdf
$ ./pdf-to-img.sh foo/
convert-im6.q16: unable to open image `images/foo/bar.jpeg': No such file or directory @ error/blob.c/OpenBlob/2701.
convert-im6.q16: unable to open image `images/foo/baz.jpeg': No such file or directory @ error/blob.c/OpenBlob/2701.
convert-im6.q16: unable to open image `images/foo/biz.jpeg': No such file or directory @ error/blob.c/OpenBlob/2701.
我究竟做错了什么?
答案1
更正后的代码:
DIR="$@"
EXT="*.pdf"
mkdir -p "${DIR}/images"
shopt -s nullglob
for pdffile in "$DIR"*.pdf; do
convert -density 300 -depth 8 -quality 90 -trim "${pdffile}" "$(dirname "${pdffile}")/images/$(basename "${pdffile%.*}").jpeg"
done
它应该将images/foo/bar.jpeg
导致错误的路径转换为这个foo/images/bar.jpeg
解释:
"foo/bar.pdf"
你在${pdffile}
变量中有这样的值
dirname ${pdffile}
- 从路径中删除最后一个非斜杠组件,留下:"foo"
basename ${pdffile%}
- 相反,删除除文件名之外的所有内容,留下:"bar.pdf"
$images
最后,在这部分之间插入子目录名称,并获得存储图像所需的路径 - foo/images/bar.jpeg
。