使用pngquant递归批处理文件

cma*_*mal 29 terminal png image batch-processing

我有很多想用pngquant处理的图像.它们以非常深的目录结构组织,因此手动cd进入每个目录并运行非常耗时pngquant -ext .png -force 256 *.png

有没有办法让这个命令在当前目录中的每个目录中的每个*.png上运行,因为需要多个深层?

Kor*_*nel 58

如果您的目录深度有限且文件太多,那么懒惰的解决方案:

pngquant *.png */*.png */*/*.png
Run Code Online (Sandbox Code Playgroud)

标准解决方案:

find . -name '*.png' -exec pngquant --ext .png --force 256 {} \;
Run Code Online (Sandbox Code Playgroud)

和多核版本:

find . -name '*.png' -print0 | xargs -0 -P8 -L1 pngquant --ext .png --force 256
Run Code Online (Sandbox Code Playgroud)

其中-P8定义了CPU的数量,并-L1定义了一个pngquant调用中要处理的图像数量(我-L4用于具有大量小图像的文件夹,以便在进程启动时保存).

  • `找到.-name'*.png'-exec pngquant --ext .png --force 256 {} \;`失败,`找不到文件 - '*.png'` (4认同)
  • 或者,根据你是否有一个相当新的`bash`或`zsh`,并且启用了选项(`bash`中的`shopt -s globstar`),你可以使用递归的glob:`pngquant**/*. png` (3认同)
  • `找到.-name'*.png'-exec pngquant -ext .png -force 256 {} \;`对我很有效.谢谢. (2认同)

Den*_*nis 16

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

pngquant **.png
Run Code Online (Sandbox Code Playgroud)

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

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

pngquant **.png --ext .png --force
Run Code Online (Sandbox Code Playgroud)