Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursively batch process files with pngquant

I have a lot of images that I would like to process with pngquant. They are organized in a pretty deep directory structure, so it is very time-consuming to manually cd into every directory and run pngquant -ext .png -force 256 *.png

Is there a way to get this command to run on every *.png in every directory within the current one, as many layers deep as necessary?

like image 474
cmal Avatar asked Mar 10 '12 16:03

cmal


2 Answers

If you have limited depth of directories and not too many files, then lazy solution:

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

A standard solution:

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

and multi-core version:

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

where -P8 defines number of CPUs, and -L1 defines a number of images to process in one pngquant call (I use -L4 for folders with a lot of small images to save on process start).

like image 114
Kornel Avatar answered Sep 28 '22 02:09

Kornel


With the fish shell you can run the following from the root of your project directory

pngquant **.png 

Which will generate new files with extensions like -or8.png or -fs8.png.

If you want to overwrite the existing files, you can use

pngquant **.png --ext .png --force 
like image 29
Dennis Avatar answered Sep 28 '22 01:09

Dennis