递归批处理文件,使用pngquant

35

我有很多图片需要使用pngquant处理。它们被组织在一个相当深的目录结构中,因此手动进入每个目录并运行pngquant -ext .png -force 256 *.png非常耗时。

是否有一种方法可以在当前目录内的每个目录中按需运行此命令,无论有多少层深度,以处理其中的所有*.png文件?


2
你使用的操作系统是什么? - Manish
2个回答

75

如果你只有有限的目录深度和不太多的文件,那么可行的懒惰解决方案是:

pngquant *.png */*.png */*/*.png

一个标准的解决方案:

find . -name '*.png' -exec pngquant --ext .png --force 256 {} \;

并行和多核版本:

find . -name '*.png' -print0 | xargs -0 -P8 -L1 pngquant --ext .png --force 256

其中-P8定义了CPU数量,-L1定义了在一个pngquant调用中要处理的图像数量(我在大量包含小图像的文件夹中使用-L4以节省处理开始时间)。


2
对我来说,find . -name '*.png' -exec pngquant -ext .png -force 256 {} \; 很有效。谢谢。 - cmal
3
根据您使用的是较新版本的 bashzsh,并且选项已启用(在 bash 中使用 shopt -s globstar),您也可以使用递归通配符来压缩所有的 .png 文件:pngquant **/*.png - gid
4
find . -name '*.png' -exec pngquant --ext .png --force 256 {} \; 出现 File not found - '*.png' 错误。需要翻译这段命令并解决该错误。 - Sprintstar
感谢您的回答,确实非常有用。verbose标志是一个不错的补充,因为处理过程通常需要一段时间才能完成。我最终在我的MacBook Intel Core i5 2.3上选择的命令是:find . -name '*.png' -print0 | xargs -0 -P2 -L4 pngquant --ext .png --force -v 256(我相信这个处理器有2个核心)。 - Tisch
进程启动开销的小型基准测试(Ryzen 1700,8c16t @ 2.7GHz),Win/cygwin上的1364个文件: xargs -0 -L 32 -P 8 ./optipng.exe ... - real = 19.7秒 || xargs -0 -I{} -P 16 ./optipng.exe ... - real = 22秒 || xargs -0 -I{} -P 8 ./optipng.exe ... - real = 27.7秒 - BotOfWar
显示剩余5条评论

22

使用fish shell,您可以从项目目录的根目录下运行以下命令:

pngquant **.png

这将生成扩展名为-or8.png-fs8.png的新文件。

如果您想覆盖现有文件,可以使用

pngquant **.png --ext .png --force

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接