我想在我的 Makefile 中的规则范围内比较两个文件的大小。在我的规则中,我将 PDF 转换为 PNG,如下所示:
.pdf.png:
@convert $< -resize 800x800 -quality 85% $@
由于某些 PNG 并不明显小于其 PDF 父级,但质量很差,因此我想在转换过程后删除这些 PNG。我的第一个想法是在上面的规则中添加这样的东西:
COMP = "`wc -c <$<` / `wc -c <$@`"|bc
if [ $COMP -lt 2 ]; then
rm $@;
fi
第一行给了我旧 PDF 文件与新 PNG 文件的压缩系数。也就是说,给出值为 0 或 1 的"错误压缩"应该会导致删除新生成的 PNG 文件。不幸的是,我在编写 Makefile 方面,特别是在管道命令方面并没有真正的经验。所以,我的问题是,我不知道如何使用第二个代码片段的第一行的结果并在 if 语句中使用它来将其与另一个值进行比较。任何提示将不胜感激:-(
配方的每一行都在不同的 shell 中执行。因此,您只能在配方的一行中使用 shell 变量。但您也可以使用行继续符((以获得更好的可读性:
var=`some-shell-command`;
echo "$$var"
相当于:
var=`some-shell-command`; echo "$$var"
记得在需要时转义扩展($$
(。在您的情况下,配方可能是:
%.png: %.png
@convert $< -resize 800x800 -quality 85% $@;
i=`stat -c%s $<`;
o=`stat -c%s $@`;
$$(( o > 2*i )) && rm -f $@ || true
好的。我现在明白了。我采用了Renaud Pacalet的方法来满足我的需求。对于那些感兴趣的人,我的规则如下所示:
.pdf.png:
@convert $< -resize 800x800 -quality 85% $@
@echo converted $<
@COMP=$$((`stat -c%s "$<"`/`stat -c%s "$@"`)); [ $$COMP -lt 2 ] && echo "bad compression: remove $@" && rm $@ || true
这将调整输入图像的大小,如果整数比为 input/output < 2
,则再次删除输出文件(在 0 或 1 的比率下,我假设压缩是错误的(。