如何在macOS(UNIX)用命令行批量逐个简化大量SVG文件路径?
解决方案:批量单独简化SVG中的每个路径
方法一:Inkscape命令行+Python脚本(推荐)
Inkscape支持通过命令行执行自定义Python扩展脚本,我们可以编写脚本遍历SVG内所有路径,单独对每个路径应用「简化路径」操作,再批量处理所有文件。
1. 编写路径简化脚本(simplify_each_path.py)
创建Python文件,内容如下:
#!/usr/bin/env python3 import inkex from inkex.paths import Path from inkex.bezier import simplify_path class SimplifyEachPath(inkex.EffectExtension): def add_arguments(self, pars): pars.add_argument("--tolerance", type=float, default=0.2, help="简化阈值(按需调整)") def effect(self): # 遍历文档中所有路径元素 for element in self.svg.xpath('//svg:path', namespaces=inkex.NSS): path = Path(element.get('d')) # 对单个路径执行简化 simplified = simplify_path(path.to_arrays(), self.options.tolerance) element.set('d', Path(simplified)) if __name__ == '__main__': SimplifyEachPath().run()
你可以调整tolerance参数(默认0.2)控制简化程度:值越大,节点减少越多、路径越平滑;值越小,保留细节越多。
2. 批量处理SVG文件
Fish Shell 版本
进入SVG文件所在目录,执行:
for svg in *.svg echo "处理 $svg..." inkscape --batch-process --extension=simplify_each_path.py "$svg" --export-filename="simplified_$svg" end
Bash Shell 版本
如果用Bash:
for svg in *.svg; do echo "处理 $svg..." inkscape --batch-process --extension=simplify_each_path.py "$svg" --export-filename="simplified_$svg" done
处理后的文件会以simplified_为前缀保存在当前目录,可按需修改文件名规则。
方法二:直接调用Inkscape内置命令(无需脚本)
不想写脚本的话,可利用--select和--verb参数逐个选择路径并简化,注意此方法会直接修改原文件,务必先备份:
for svg in *.svg echo "处理 $svg..." # 获取所有路径的ID path_ids=$(inkscape --query-all "$svg" | grep 'path' | cut -d',' -f1) # 逐个选择路径执行简化 for id in $path_ids inkscape --batch-process --select="$id" --verb="PathSimplify" --verb="FileSave" --verb="FileQuit" "$svg" end end
注:--verb参数在Inkscape 1.0+中标记为 deprecated,但目前仍可正常使用。
关键注意事项
- 备份原文件:处理前务必备份所有SVG,避免意外损坏。
- 测试参数:先在Inkscape图形界面测试单个路径的简化阈值(Cmd/L弹出的对话框),再对应调整脚本参数。
- 分批次处理:近2000个文件建议分批次执行,避免占用过多系统资源。
内容的提问来源于stack exchange,提问作者user229543
相关产品推荐
相关产品推荐

