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) .
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
.
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