Bash:如何命名gs输出文件,如输入文件,但文件扩展名不同?

时间:2015-10-02 09:39:33

标签: bash shell batch-processing ghostscript

我在一个目录中有很多postscript(.ps)文件,其名称如

cct@TOP_VMAIN_AND_3V3_SMPS,smps_ota,schematic.ps 

我想批量转换为.png个文件

我已经拥有以下命令(使用bash):

gs -dSAFER -dBATCH -sDEVICE=pnggray -dTextAlphaBits=4 -r300 -sOutputFile=out-%d.png *.ps

这没关系,但很明显,它只输出out-1.pngout-2.png 等等,这意味着我不知道.png来自哪个.ps

我想要做的是能够保留这样的文件名

cct@TOP_VMAIN_AND_3V3_SMPS,smps_ota,schematic.ps 

转换为

cct@TOP_VMAIN_AND_3V3_SMPS,smps_ota,schematic.png

为每个文件。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

使用bash的参数扩展:

f="cct@TOP_VMAIN_AND_3V3_SMPS,smps_ota,schematic.ps"
echo "${f%.*}.png"  # Remove everything after the last dot.

答案 1 :(得分:1)

您需要一个循环才能获得单个文件名:

for psf in *.ps; do 
    pngf="`basename $psf`.png"; 
    gs -dSAFER -dBATCH -sDEVICE=pnggray -dTextAlphaBits=4 -r300 -sOutputFile="$pngf" "$psf"
done

但这是未经测试的。它也慢,特别是对于许多小文件,因为ghostscript一遍又一遍地重新启动。很可能人们可以通过管道将输入输入到后台运行的gs,并通过管道将同一个运行进程的输出重定向到不同的文件,但这似乎很难(我怎么知道呢)那个ghostscript已经完成了一份工作?)并且有点矫枉过正。