UNIX: Trier les fichiers par numéro / version sans remplissage 0

En fin de compte, j’ai voulu définir la dernière version en tant que variable d’environnement, complétant ainsi la réponse sélectionnée (qui m’a fourni le sorting correct):

export LATEST_VERSION=$(printf '%s\n' * | sort -rV | head -1) 

J’ai un répertoire avec les noms de répertoire suivants:

 ls -1r . 2.0 1.8 16.1 16.0 15.5 15.0 14.5 14.1 14.0 1.3 1.2 1.1.5 1.1.3 1.1.2 

Je voudrais les sortinger pour obtenir la dernière version:

 ls -1r . | head -1 16.1 

Donc, l’ordre sous-jacent devrait ressembler à ceci:

 16.1 16.0 15.5 15.0 14.5 14.1 14.0 2.0 1.8 1.3 1.2 1.1.5 1.1.3 1.1.2 

Toute aide serait grandement appréciée. Plus simple, mieux c’est, mais je suis ouvert à toute solution. Merci!

Le sorting GNU moderne offre un drapeau -V pour le sorting selon les règles de numéro de version:

 $ printf '%s\n' * | sort -rV 16.1 16.0 15.5 15.0 14.5 14.1 14.0 2.0 1.8 1.3 1.2 1.1.5 1.1.3 1.1.2 

Notez que ce qui précède n’utilise pas ls . En règle générale, vous ne devez pas parsingr la sortie de ls (1) .

Documentation

De man sort :

-V, –version-sort
sorte naturelle de (version) numéros dans le texte

Ce qui précède provient de la page de manuel GNU.

Le sorting de FreeBSD prend également en charge -V .

OSX

Le sorting d’Apple est un sorting GNU de 2005 qui est antérieur à la prise en charge de l’option -V . Un work-around peut être trouvé ici . (Conseils de chapeau: l ‘, mklement0)

FWIW, je suis maintenant sous Mac OS, et je n’ai pas encore démarré sous Linux pour tester. Mais, il semble que le sorting avec l’option numérique a le sens de le faire:

Mais, j’ai un répertoire avec vos sous-répertoires, et je le sortinge mal:

 /Users/thedave/tmp $ ls -1r 2.0 16.1.12 16.1 16.0 15.5 15.0 14.5 14.1 14.0 1.8 1.3 1.2 1.1.5 1.1.3 1.1.2 1.1 1.0.1 1.0 

sort (1) accepte ‘-n’ pour numeric et ‘-r’ pour reverse:

 /Users/thedave/tmp $ ls | sort -rn 16.1.12 16.1 16.0 15.5 15.0 14.5 14.1 14.0 2.0 1.8 1.3 1.2 1.1.5 1.1.3 1.1.2 1.1 1.0.1 1.0