如何在保持文件名的情况下将eps文件转换为png文件?
在Linux的某个文件夹里,我有一些以*.eps结尾的文件,我想把它们转换成*.png格式,并且保持文件名不变,比如:ball.eps要转换成ball.png。我试过这样做:
convert *.eps *.png
但是结果不太满意。为了实现这个,我需要写一个简单的脚本,可能用Python或者bash,那么我该如何在Python中获取文件夹里的文件名呢?谢谢。
3 个回答
2
我在寻找解决 convert: not authorized
的方法时,发现这里的内容,顺便想给 @vaibhav-jain 的回答提供一些改进建议。
首先,如果你想把 EPS 文件转换成 PNG 格式,这里有个方法可以直接使用 Ghostscript,而不需要用 ImageMagick:
#!/bin/sh
for file in *.eps; do
gs -dSAFER -dEPSCrop -r300 -sDEVICE=pngalpha -o "${file%.*}.png" "$file"
done
-dSAFER
是让 Ghostscript 进入一个安全模式,这样 Postscript 代码只能和你在命令行上指定的文件互动。(没错,Postscript 是完全可计算的。)-dEPSCrop
是告诉 Ghostscript 不要把文件扩展到可打印页面的大小。(详细信息)- 如果你在转换 EPS 文件,默认的 72 DPI 可能不太合适,所以
-r300
是用来指定 300 DPI 的。(详细信息) -sDEVICE
是用来选择输出格式的(可以查看手册的 设备部分,了解其他选项)。-o
是-dBATCH -dNOPAUSE -sOutputFile=
的简写(详细信息)
至于其他的改动:
- 除非你不想让输出文件和输入文件放在同一个文件夹里,否则没必要去掉前面的路径... 如果真是这种情况,可以用
${file##*/}
替换$(basename "$file")
(去掉最后一个/
之前的所有字符),这样可以使用 shell 内置命令。 - 如果你用的是 Zsh 并且想写一个一次性的单行命令,Zsh 允许嵌套替换,所以
${${file##*/}%.*}
是有效的。 - 从风格上讲,我更喜欢
for ...; do
的写法,而不是把do
单独放在一行。 - 这个脚本不需要 bash,所以在这种情况下可以用
#!/bin/sh
,这样你会得到一个更轻量的运行环境(dash),在基于 Debian 的系统上运行,并且兼容那些默认不安装/bin/bash
的 BSD 系统。
2
试试下面这个脚本:
#!/bin/bash
for file in *.eps
do
filename=$(basename "$file")
filename=${filename%.*}
convert $file $filename.png
done
希望这个能对你有帮助。
for file in *.eps
这行代码会列出所有以 .eps 结尾的文件filename=$(basename "$file")
这行代码会获取文件的原始名字filename=${filename%.*}
这行代码会去掉文件名中的 .eps 后缀convert $file $filename.png
这行代码会把文件转换成 .png 格式
2
编辑: 如果你想让文件名保持一致,其实不需要用循环。你可以这样做:
mkdir backup_directory && cp *.eps backup_directory
mogrify -format png *.eps
mogrify
就像 convert
,但它是直接修改文件的,所以在使用之前最好先把原文件备份到别的地方,以免丢失原始文件。
如果用循环的话,可以在 bash 中这样做:
for f in *.eps; do b=$(basename "$f" .eps); convert "$f" "$b".png; done
你在尝试中使用的通配符 *
会扩展成所有文件的列表,这样就不符合你的需求了。使用循环变量 "$f"
,你就只处理一个文件,这样更合适。
你也可以不调用 basename
,直接使用:
for f in *.eps; do convert "$f" ${f%eps}png; done
这样可以把文件名末尾的 eps
去掉,并加上 png
。