Zsh: sort globs in natural order with the (n) glob qualifier

Letters, sorted by case, naturally.

Globs sort filenames character by character, so numbered files often come out in a surprising order, with 10 before 2. Zsh has a neat fix for this: the n glob qualifier, which applies a “natural” sort, treating any run of digits as a number rather than a string of characters.

I found this feature useful when building a PDF from multiple files.n I exported my multi-page document from Inkscape to one PNG per page, named Page 1.png, Page 2.png, and so on. I then stitched them into a single PDF with ImageMagick:

$ magick *.png document.pdf

But when I opened document.pdf, the pages were jumbled: page 10 came straight after page 1. That made no sense!

To debug, I checked what the glob expanded to, using print -l to print each match on its own line:

$ print -l *.png
Page 1.png
Page 10.png
Page 11.png
Page 12.png
Page 2.png
Page 3.png
...

There it was: Page 10.png came before Page 2.png, because the character 1 sorts before 2.

Adding the n glob qualifier makes Zsh sort numbers by their numeric value, giving “natural” order:

$ print -l *.png(n)
Page 1.png
Page 2.png
Page 3.png
...
Page 10.png
Page 11.png
Page 12.png

I used the qualifier in the ImageMagick command:

$ magick *.png(n) document.pdf

…and my PDF came out in proper order.

Make it the default

If you always want natural ordering, enable the NUMERIC_GLOB_SORT option in your ~/.zshrc:

setopt numeric_glob_sort

Then all globs sort numerically, no qualifier needed:

$ magick *.png document.pdf

This is what I’ve done, and I’ve had no issues in a few years of using it.

Reverse order

n only changes how names compare, so you can combine it with the other sorting qualifiers. For example, On sorts by name, descending, so (nOn) gives reverse natural order:

$ print -l *.png(nOn)
Page 12.png
Page 11.png
Page 10.png
Page 9.png
...
Page 1.png

This could be useful if you want to flip a series of files, for example.

Fin

May order pages your in stay,

—Adam


Check out my new book Boost Your GitHub DX.


Subscribe via RSS, Twitter, Mastodon, or email:

One summary email a week, no spam, I pinky promise.

Related posts:

Tags: