我使用下面的脚本将目录中的所有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文件旧的文件?
答案 0 :(得分: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
变量。基本上%pdf
告诉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="$@" "$<"
只要您想要生成较新的PNG,就可以使用make
运行它。