Part of my Hugo site continuous deployment workflow is the processing of 210 images, at time of writing.
Here’s my one-liner:
find public/ -not -path "*/static/*" \( -name '*.png' -o -name '*.jpg' -o -name '*.jpeg' \) -print0 | xargs -0 -P8 -n2 mogrify -strip -thumbnail '1000>' -format jpg
I use find
to target only certain image file formats in certain directories. With mogrify
, part of ImageMagick, I resize only the images that are larger than a certain dimension, compress them, and strip the metadata. I tack on the format
flag to create jpg copies of the images.
Here’s the one-liner again (broken up for better reading):
# Look in the public/ directory
find public/ \
# Ignore directories called "static" regardless of location
-not -path "*/static/*" \
# Print the file paths of all files ending with any of these extensions
\( -name '*.png' -o -name '*.jpg' -o -name '*.jpeg' \) -print0 \
# Pipe the file paths to xargs and use 8 parallel workers to process 2 arguments
| xargs -0 -P8 -n2 \
# Tell mogrify to strip metadata, and...
mogrify -strip \
# ...compress and resize any images larger than the target size (1000px in either dimension)
-thumbnail '1000>' \
# Convert the files to jpg format
-format jpg
That’s it. That’s the post.
Top comments (12)
Having more workers allows you to process more data (in this case images) at the same time. The workers can process different chunks of the image. Number of workers will match the number of CPU cores you have on your computer. This is the same technique you would adopt when compiling code rather than wait for data to be processed sequentially.
You should write a blog post that does the same thing using sharp!
Great one liner. Was looking for something just like this. Thanks!
Sweet! You're welcome Brett!
I think my work here is done. 😁
Super cool! I also was looking for this kind of automation. Thank you!
I actually needed something like this. Thank you so much!
Glad to hear it! You're welcome!
Thanks for sharing this.
You're welcome! Hope it was useful to you!
We need more posts like this.
I'll do my best! :)