我有很多图片需要使用pngquant处理。它们被组织在一个相当深的目录结构中,因此手动进入每个目录并运行pngquant -ext .png -force 256 *.png
非常耗时。
是否有一种方法可以在当前目录内的每个目录中按需运行此命令,无论有多少层深度,以处理其中的所有*.png文件?
我有很多图片需要使用pngquant处理。它们被组织在一个相当深的目录结构中,因此手动进入每个目录并运行pngquant -ext .png -force 256 *.png
非常耗时。
是否有一种方法可以在当前目录内的每个目录中按需运行此命令,无论有多少层深度,以处理其中的所有*.png文件?
如果你只有有限的目录深度和不太多的文件,那么可行的懒惰解决方案是:
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
以节省处理开始时间)。
find . -name '*.png' -exec pngquant -ext .png -force 256 {} \;
很有效。谢谢。 - cmalbash
或 zsh
,并且选项已启用(在 bash
中使用 shopt -s globstar
),您也可以使用递归通配符来压缩所有的 .png
文件:pngquant **/*.png
。 - gidfind . -name '*.png' -exec pngquant --ext .png --force 256 {} \;
出现 File not found - '*.png'
错误。需要翻译这段命令并解决该错误。 - Sprintstarfind . -name '*.png' -print0 | xargs -0 -P2 -L4 pngquant --ext .png --force -v 256
(我相信这个处理器有2个核心)。 - Tischxargs -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使用fish shell,您可以从项目目录的根目录下运行以下命令:
pngquant **.png
这将生成扩展名为-or8.png
或-fs8.png
的新文件。
如果您想覆盖现有文件,可以使用
pngquant **.png --ext .png --force