Ordenación por número de versión en la terminal con sort y ls

AdriMcGrady 24/02/2024

Este post va a estar centrado en unas pequeñas opciones de los comandos sort y ls. Estas opciones de estos comandos nos van a permitir ordenar números de versiones. Es simplemente un pequeño truco que descubrí no hace mucho y me apetece compartirlo.

Los comandos sort y ls

Pero antes de nada hay que dar una breve pincelada sobre que son los comandos sort y ls.

Por si no los conoces (algo raro si has llegado a este lugar), son utilidades bastante básicas a la hora de trabajar con la terminal.

  • En el caso de sort, su función es ordenar las líneas de un archivo de texto o de la entrada estándar según el caso. Y eso es prácticamente todo lo que tengo que decir al respecto. Evidentemente tiene un montón de opciones que puedes consultar en su página de man.
  • En cuanto a ls, su función es básicamente listar el contenido de un directorio. Por supuesto, también dispone de una ingente cantidad de opciones que también puedes revisar en su página de man.

Ordenación de versiones con el comando sort usando la opción -V o --version-sort

De todas las opciones del comando sort voy a centrarme únicamente en una: -V o --version-sort. Y es que, hace poco, tuve que hacer un pequeño script que en algún punto necesitaba ordenar una lista de paquetes disponibles y realizar una operación con ella. Esta tesitura fue la que me hizo descubrir este pequeño truco que hoy comparto contigo.

La opción -V o --version-sort, como prefieras, te permite ordenar un conjunto de líneas tratándolas como versiones. Estas versiones pueden ser de código, de software o de algún tema similar. Parece una cuestión baladí, pero es muy útil.

Vamos a imaginar que tenemos la siguiente lista de ficheros que se corresponden con diferentes versiones de un software empaquetado en rpm.

  • migransoftware-2.22.rpm
  • migransoftware-22.2.rpm
  • migransoftware-2.2.2.rpm
  • migransoftware-2.2.2.3.rpm

Por tanto, este sería el fichero versiones.txt con el que vamos a trabajar como demostración:

migransoftware-2.22.rpm
migransoftware-22.2.rpm
migransoftware-2.2.2.rpm
migransoftware-2.2.2.3.rpm

Ahora veamos que pasa si usamos sort para ordenar las lineas de este fichero de versiones.

En primer lugar, os muestro el resultado con la ordenación por defecto sin indicar ninguna opción. Como se puede observar, el resultado no es correcto. Por ejemplo, la versión 2.2.2 debería ser la primera, pero la salida no muestra eso.

$ sort versiones.txt 
migransoftware-2.2.2.3.rpm
migransoftware-2.2.2.rpm
migransoftware-2.22.rpm
migransoftware-22.2.rpm

¿Y si probamos con la opción -n o --numeric-sort que trata las líneas como valores numéricos? Pues vamos a ver que el resultado es igualmente incorrecto:

$ sort -n versiones.txt
migransoftware-2.2.2.3.rpm
migransoftware-2.2.2.rpm
migransoftware-2.22.rpm
migransoftware-22.2.rpm

Ahora sí que sí, vamos a probar con la opción -V o --version-sort:

$ sort -V versiones.txt
migransoftware-2.2.2.rpm
migransoftware-2.2.2.3.rpm
migransoftware-2.22.rpm
migransoftware-22.2.rpm

Como se puede observar el resultado es perfecto y la lista de opciones queda ordenada como debe.

Ordenación de versiones con el comando ls usando la opción -v

Al igual que en el caso anterior, de la gran cantidad de versiones del comando ls, voy a hablarte exclusivamente de la opción v.

De manera similar a lo descrito con sort, y tal y como dice la documentación del comando ls, la opción -v ordena de modo natural los números de versión según el texto”.

Para mostrar su funcionamiento usaremos la misma lista de versiones que en los ejemplos anteriores. Pero en este caso, en vez de tener un fichero de versiones trabajaremos directamente con archivos en un directorio. Por supuesto, cada versión tendrá su propio archivo. De modo que si listamos el directorio donde están guardados los ficheros obtendremos lo siguiente (Se añade la opción -1 que modifica el comportamiento de ls para mostrar un fichero por línea y que se vea con más claridad):

$ ls -1
migransoftware-2.2.2.3.rpm
migransoftware-2.2.2.rpm
migransoftware-2.22.rpm
migransoftware-22.2.rpm

Como se puede observar en la salida anterior, la ordenación no es correcta. ¿Pero que pasa si se usa la opción -v? Pues que tendremos una lista correctamente ordenada según la versión como se puede apreciar a continuación (seguimos añadiendo la opción -1 para mayor claridad):

$ ls -1 -v
migransoftware-2.2.2.rpm
migransoftware-2.2.2.3.rpm
migransoftware-2.22.rpm
migransoftware-22.2.rpm
Enlaces de interés:

Artículo anterior

Artículos relacionados: