How can I sort file names by version numbers?
Edit: It turns out that Benoit was sort of on the right track and Roland tipped the balance
You simply need to tell sort
to consider only field 2 (add ",2"):
find ... | sort --version-sort --field-separator=- --key=2,2
Original Answer: ignore
If none of your filenames contain spaces between the hyphens, you can try this:
find ... | sed 's/.*-\([^-]*\)-.*/\1 \0/;s/[^0-9] /.&/' | sort --version-sort --field-separator=- --key=2 | sed 's/[^ ]* //'
The first sed
command makes the lines look like this (I added "10" to show that the sort is numeric):
1.9.a command-1.9a-setup2.0.c command-2.0c-setup2.0.a command-2.0a-setup2.0 command-2.0-setup10 command-10-setup
The extra dot makes the letter suffixed version number sort after the version number without the suffix. The second sed
command removes the prefixed version number from each line.
There are lots of ways this can fail.
Looks like this works:
find /data/ -name 'command-*-setup' | sort -t - -V -k 2,2
not with sort but it works:
tree -ivL 1 /data/ | perl -nlE 'say if /\Acommand-[0-9][0-9a-z.]*-setup\z/'
-v: sort the output by version
-i: makes tree not print the indentation lines
-L level: max display depth of the directory tree