0

我使用下面的脚本将目录中的所有 pdf 文件转换为 png 文件,并且我只想在尚未转换的文件上运行它。

#!/bin/bash
# Convert pdf to png
for f in *.pdf
do
    echo "Converting $f"
    gs -dNOPAUSE -dBATCH -sDEVICE=png256 -r480 -q -sOutputFile="png/$f.png" "$f"
done
rename -f 's/\.pdf\.png/\.png/' png/*.pdf.png

如何修改循环,使其仅限于相应 png 文件不存在或比 pdf 文件旧的文件?

4

1 回答 1

3

对脚本的简单修改:

#!/bin/bash
# Convert pdf to png
for f in *.pdf
do
    png="png/${f%pdf}png"
    if [ -e "$png" -a "$f" -nt "$png" ]; then
        continue
    fi

    echo "Converting $f"
    gs -dNOPAUSE -dBATCH -sDEVICE=png256 -r480 -q -sOutputFile="$png" "$f"
done

首先,我们$png使用就地编辑创建一个变量。基本上,%pdfbash 告诉 bash 删除最后一次出现的pdf,即扩展名。然后我们可以将它放入一个字符串中,为其添加前缀png/并添加 png 扩展名。这为您节省了最后一个重命名命令。

现在我们有一个if语句,continue如果满足某个条件则循环。继续意味着转到循环的下一个迭代,而不为该迭代执行任何其他操作。条件是 "$png" 存在 ( -e "$png") 并且 ( -a) "$f" 比 "$png" ( "$f" -nt "$png") 更新。

但我建议编写一个 Makefile:

PDFS := $(wildcard *.pdf)
PNGS := $(addprefix png/,$(PDFS:.pdf=.png))
all: $(PNGS)
png/%.png: %.pdf
    gs -dNOPAUSE -dBATCH -sDEVICE=png256 -r480 -q -sOutputFile="$@" "$<"

make并在您想要生成更新的 PNG的任何时候运行它。

于 2012-10-03T23:58:11.007 回答