比较Makefile中的文件大小

比较Makefile中的文件大小,file,makefile,compare,pipe,bc,File,Makefile,Compare,Pipe,Bc,我想比较Makefile中规则范围内的两个文件的大小。 按照我的规则,我将PDF转换为PNG,如下所示: .pdf.png: @convert $< -resize 800x800 -quality 85% $@ .pdf.png: @转换$

我想比较Makefile中规则范围内的两个文件的大小。 按照我的规则,我将PDF转换为PNG,如下所示:

.pdf.png:
    @convert $< -resize 800x800 -quality 85% $@
.pdf.png:
@转换$<-调整大小800x800-质量85%$@
由于一些PNG并没有明显小于其PDF父项,但质量非常差,因此我希望在转换过程后删除这些PNG。 我的第一个想法是在上述规则中添加如下内容:

COMP = "`wc -c <$<` / `wc -c <$@`"|bc
if [ $COMP -lt 2 ]; then \
    rm $@; \
fi

COMP=“`wc-c配方的每一行都在不同的shell中执行。因此,您只能在配方的单行中使用shell变量。但您也可以使用行延续(
\
)以提高可读性:

var=`some-shell-command`; \
echo "$$var"
相当于:

var=`some-shell-command`; echo "$$var"
记住在需要时退出make扩展(
$

%.png: %.png
    @convert $< -resize 800x800 -quality 85% $@; \
    i=`stat -c%s $<`; \
    o=`stat -c%s $@`; \
    $$(( o > 2*i )) && rm -f $@ || true
%.png:%.png
@转换$<-调整800x800的大小-质量85%$@\
i=`stat-c%s$2*i)&&rm-f$@| true

好的。我现在知道了。我采用了雷诺·帕卡莱的方法来满足我的需求。对于那些感兴趣的人,我的规则如下:

.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

.pdf.png:
@转换$<-调整大小800x800-质量85%$@
@回波转换$<

@COMP=$$(`stat-c%s“$非常感谢你的回答,雷诺。在你的例子中,
|true
是什么意思?另外,我想用上面的方法比较
大小(输入文件)/大小(输出文件)的分数
使用整数。通过仅比较两个大小,我将始终有差异。但是,我只想在大小差异显著时删除输出文件,即分数为1或0(输出文件更大)如何将这两个结果结合在一起?如果代码比较失败,<代码> >真/ <代码>部分被评估。没有这个完整表达式将以非零状态退出。如果文件比输入文件大两倍以上,则放入文件。我个人更喜欢
$$((o>2*I))
而不是除法,因为整数除法是四舍五入的。但是你的方法也可以。