coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: version-sort ugliness or bugs


From: Vincent Lefevre
Subject: Re: version-sort ugliness or bugs
Date: Mon, 23 Aug 2021 10:05:36 +0200
User-agent: Mutt/2.1.1+44 (02298c19) vl-138565 (2021-07-29)

On 2021-04-15 23:47:34 +0200, Vincent Lefevre wrote:
> I'm currently using version-sort in order to get integers sorted
> in strings (due to the lack of simple numeric sort like in zsh),
> but I've noticed some ugliness. This may be bugs, not I'm not sure
> since the description of the sorting method in the Coreutils manual
> takes several pages with all its exceptions, and I expect no-one
> will try to understand.
[...]

I use this mainly to sort files numerically with "ls -v", but in
practice, this doesn't have the expected intent. Here's an example.
First, -v seems useful in some simple case.

Without -v:

$ ls -1 /var/log/dpkg.log*
/var/log/dpkg.log
/var/log/dpkg.log.1
/var/log/dpkg.log.10.gz
/var/log/dpkg.log.11.gz
/var/log/dpkg.log.12.gz
/var/log/dpkg.log.2.gz
/var/log/dpkg.log.3.gz
/var/log/dpkg.log.4.gz
/var/log/dpkg.log.5.gz
/var/log/dpkg.log.6.gz
/var/log/dpkg.log.7.gz
/var/log/dpkg.log.8.gz
/var/log/dpkg.log.9.gz

One can see that 10, 11, 12 come before 2, which is bad. The -v option
solves this issue:

$ ls -1v /var/log/dpkg.log*
/var/log/dpkg.log
/var/log/dpkg.log.1
/var/log/dpkg.log.2.gz
/var/log/dpkg.log.3.gz
/var/log/dpkg.log.4.gz
/var/log/dpkg.log.5.gz
/var/log/dpkg.log.6.gz
/var/log/dpkg.log.7.gz
/var/log/dpkg.log.8.gz
/var/log/dpkg.log.9.gz
/var/log/dpkg.log.10.gz
/var/log/dpkg.log.11.gz
/var/log/dpkg.log.12.gz

But when one has several kinds of log files (different suffixes),
the -v option makes the wanted order incorrect.

Without -v, this is correct (well, here because the numbers remain
less than 10):

$ ls -1 /var/log/mail.*
/var/log/mail.err
/var/log/mail.err.1
/var/log/mail.err.2.gz
/var/log/mail.err.3.gz
/var/log/mail.err.4.gz
/var/log/mail.log
/var/log/mail.log.1
/var/log/mail.log.2.gz
/var/log/mail.log.3.gz
/var/log/mail.log.4.gz
/var/log/mail.log.5.gz
/var/log/mail.warn
/var/log/mail.warn.1
/var/log/mail.warn.2.gz
/var/log/mail.warn.3.gz
/var/log/mail.warn.4.gz
/var/log/mail.warn.5.gz

But the -v option has an unwanted effect, where all log files without
a number come first.

$ ls -1v /var/log/mail.*
/var/log/mail.err
/var/log/mail.log
/var/log/mail.warn
/var/log/mail.err.1
/var/log/mail.err.2.gz
/var/log/mail.err.3.gz
/var/log/mail.err.4.gz
/var/log/mail.log.1
/var/log/mail.log.2.gz
/var/log/mail.log.3.gz
/var/log/mail.log.4.gz
/var/log/mail.log.5.gz
/var/log/mail.warn.1
/var/log/mail.warn.2.gz
/var/log/mail.warn.3.gz
/var/log/mail.warn.4.gz
/var/log/mail.warn.5.gz

As a comparison, zsh with NUMERIC_GLOB_SORT gives the expected order
in both cases:

joooj% setopt NUMERIC_GLOB_SORT
joooj% printf "%s\n" /var/log/dpkg.log*
/var/log/dpkg.log
/var/log/dpkg.log.1
/var/log/dpkg.log.2.gz
/var/log/dpkg.log.3.gz
/var/log/dpkg.log.4.gz
/var/log/dpkg.log.5.gz
/var/log/dpkg.log.6.gz
/var/log/dpkg.log.7.gz
/var/log/dpkg.log.8.gz
/var/log/dpkg.log.9.gz
/var/log/dpkg.log.10.gz
/var/log/dpkg.log.11.gz
/var/log/dpkg.log.12.gz
joooj% printf "%s\n" /var/log/mail.*
/var/log/mail.err
/var/log/mail.err.1
/var/log/mail.err.2.gz
/var/log/mail.err.3.gz
/var/log/mail.err.4.gz
/var/log/mail.log
/var/log/mail.log.1
/var/log/mail.log.2.gz
/var/log/mail.log.3.gz
/var/log/mail.log.4.gz
/var/log/mail.log.5.gz
/var/log/mail.warn
/var/log/mail.warn.1
/var/log/mail.warn.2.gz
/var/log/mail.warn.3.gz
/var/log/mail.warn.4.gz
/var/log/mail.warn.5.gz

-- 
Vincent Lefèvre <vincent@vinc17.net> - Web: <https://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]