如何在保持文件名的情况下将eps文件转换为png文件?

3 投票
3 回答
4288 浏览
提问于 2025-04-18 05:24

在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

希望这个能对你有帮助。

  1. for file in *.eps 这行代码会列出所有以 .eps 结尾的文件
  2. filename=$(basename "$file") 这行代码会获取文件的原始名字
  3. filename=${filename%.*} 这行代码会去掉文件名中的 .eps 后缀
  4. 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

撰写回答