207 - Exa el reemplazo de ls
¿Ha llegado el fin de la hegemonía de ls en el terminal? En este episodio del podcast te hablo sobre una exa el reemplazo de ls
Una de las cuestiones que llaman poderosamente la atención es lo estático que es GNU/Linux. En el sentido que muchas de las herramientas no evolucionan nada en absoluto, o al menos, que no hay cambios aparentes en la herramienta. Este es el caso por ejemplo de ls
. ¿Porque es una herramienta que no ha evolucionado prácticamente nada?. Es posible que te preguntes ahora, ¿y para que es necesario que evoluciones? Pues porque todo lo demás si que evoluciona. Por ejemplo, ahora tienes control de versiones, tienes contenedores, y otras herramientas que inicialmente no existían o no se les daba la importancia que tienen ahora. En este sentido, a lo mejor, es necesario ir pensando en cambiar viejas herramientas por nuevas, que se adecuen mas a los tiempos que corren. En este sentido tienes exa el reemplazo de ls escrito en Rust.
Exa el reemplazo de ls escrito en Rust
¿Que es exa?
exa es una herramienta que trata de convertirse en el reemplazo de ls
. Para ello, trae mas y mejores opciones y características por defecto. Así por ejemplo, utiliza colores para distinguir el tipo de archivos y la meta información. Distingue entre enlaces, atributos extendidos y Git. Pero, no solo esto, sino que además se trata de un binario único, de pequeño tamaña y suficientemente rápido.
Como contrapartida, el comportamiento de exa
es ligeramente distinto del de ls
. Aunque decir, que esto es algo que han hecho sus creadores de forma deliberada, en tanto en cuanto buscan mejorar la experiencia de usuario.
Características
exa tiene una serie de características que lo hace especialmente interesante, y destacable frente a ls
, como las que te muestro a continuación.
Colores
Esta es una de las características mas interesantes de exa
, el esquema de colores. Se tata de una característica pensada y diseñada para terminales de 256 colores. Pero no solo colorea en función del tipo de archivos, sino que si utilizas la vista detallada exa -l
la salida también se colorea por columnas.
Esta característica que a priori te puede parecer superficial, no lo es ni mucho menos, en tanto en cuanto, te permite leer la información listada con mucha mayor facilidad.
exa
no necesita ninguna configuración para mostrarte el coloreado que tiene por defecto.
Otra cuestión interesante, aunque no está directamente relacionada con el color, pero si con la facilidad de lectura es la posibilidad de utilizar la opción -F
. Esta opción, añadirá un carácter de indicador de tipo al final del nombre en el caso de los archivos especiales,
- directorio =>
directorio/
- ejecutable =>
ejecutable*
- fifo =>
fifo|
- enlace =>
enlace@
- socket =>
socket=
Vista de rejilla
La vista de rejilla es la vista por defecto que se mostrará si no especificas ninguna opción adicional. También la puedes seleccionar utilizando la opción --grid
. Indicar que el tamaño de las columnas de la rejilla, dependerá de los nombres de los archivos que se muestren.
Es posible cambiar la dirección de la rejilla utilizando la opción --across
o -x
. Esta opción la puedes utilizar en solitario o combinada con la anterior, aunque el efecto va a ser el mismo.
Otra opción es la vista --oneline
o -1
, esto te mostrará una rejilla de una sola columna. Como te puedes imaginar esta opción es incompatible con las anteriores.
Por último para definir el tamaño de las columnas se tiene en cuenta el ancho total. Este ancho total, lo puedes definir como una variable de entorno COLUMNS=80
.
Vista detallada o vista larga
Otra vista, que seguro que terminará por convertirse en tu vista por defecto, es la vista larga o vista detallada, donde no solo te muestra los nombres de los archivos que lista sino también la meta información de cada uno de ellos. Información como el tamaño, las fechas el usuario, etc. Por ejemplo,
lrwxrwxrwx 6 lorenzo 27 ago 6:27 bpytop-themes -> themes
.rwxrwxr-x 168k lorenzo 27 ago 6:27 bpytop.py
.rw-rw-r-- 3,8k lorenzo 27 ago 6:27 CHANGELOG.md
Una opción interesante es mostrar el encabezado de cada una de las columnas. Para ello tienes que utilizar la opción -h
o --header
, tal y como ves a continuación,
Permissions Size User Date Modified Name
lrwxrwxrwx 6 lorenzo 27 ago 6:27 bpytop-themes -> themes
.rwxrwxr-x 164Ki lorenzo 27 ago 6:27 bpytop.py
.rw-rw-r-- 3,8Ki lorenzo 27 ago 6:27 CHANGELOG.md
Respecto el tamaño, indicar que los valores que muestra ya están formateados en bytes, kilobytes, megabytes, etc, dependiendo del tamaño del archivo en cuestión. En el caso de que quisieras ver el formato en binario, tendrías que utilizar la opción -b
o --binary
. Por ejemplo,
lrwxrwxrwx 6 lorenzo 27 ago 6:27 bpytop-themes -> themes
.rwxrwxr-x 164Ki lorenzo 27 ago 6:27 bpytop.py
.rw-rw-r-- 3,8Ki lorenzo 27 ago 6:27 CHANGELOG.md
Por defecto se muestra información relativa al propietario del archivo, pero no al grupo. En el caso de que quisieras ver también la información del grupo, tienes que utilizar la opción -g
o --group
, tal y como puedes ver a continuación,
Permissions Size User Group Date Modified Name
lrwxrwxrwx 6 lorenzo lorenzo 27 ago 6:27 bpytop-themes -> themes
.rwxrwxr-x 164Ki lorenzo lorenzo 27 ago 6:27 bpytop.py
.rw-rw-r-- 3,8Ki lorenzo lorenzo 27 ago 6:27 CHANGELOG.md
En cuanto a la información temporal, por defecto se muestra la correspondiente a cuando fue modificado el archivo, pero también puedes ver la fecha del último acceso, o la fecha en la que se modificó la meta información del archivo. Esto se puedes seleccionar con las opciones --modified
, --accessed
y --changed
. También puedes mostrar la fecha cuando fue creado utilizando la opción --created
.
En cuanto al formato de las fechas, puedes seleccionar diferentes, utilizando la opción --time-style=
. Por ejemplo,
$ exa -lbh --time-style=long-iso
Permissions Size User Date Modified Name
lrwxrwxrwx 6 lorenzo 2020-08-27 06:27 bpytop-themes -> themes
.rwxrwxr-x 164Ki lorenzo 2020-08-27 06:27 bpytop.py
.rw-rw-r-- 3,8Ki lorenzo 2020-08-27 06:27 CHANGELOG.md
Combinado la opción --grid
con la opción --long
, conseguirás mostrar varias columnas como la que te muestro mas arriba.
Vista de árbol
Una vista que no podía faltar es la vista de árbol, una solución similar al comando tree
. No solo esto, sino que también puedes indicar la profundidad a la que se pintará el árbol. Por ejemplo,
exa --tree --level=2
.
├── bpytop-themes -> themes
├── CONTRIBUTING.md
├── Imgs
│ ├── init.png
│ └── options.png
└── themes
├── default_black.theme
└── whiteout.theme
Y no solo esto, sino que además lo puedes combinar con la opción --long
, para que te muestre la meta información de cada uno de los archivos.
exa --tree --level=2 --long
drwxrwxr-x - lorenzo 27 ago 6:27 .
lrwxrwxrwx 6 lorenzo 27 ago 6:27 ├── bpytop-themes -> themes
drwxrwxr-x - lorenzo 27 ago 6:27 ├── Imgs
.rw-rw-r-- 116k lorenzo 27 ago 6:27 │ └── options.png
drwxrwxr-x - lorenzo 27 ago 6:27 └── themes
.rw-rw-r-- 2,2k lorenzo 27 ago 6:27 └── whiteout.theme
exa y el control de versiones
Otra de las características que seguro te resultan realmente interesantes de este reemplazo de ls
es que te permite trabajar con el control de versiones de Git de forma sencilla. Así para cada uno de los archivos, podrás ver en que estado se encuentra en cuanto al control de versiones se refiere.
Cuando estés dentro de un repositorio Git, exa puede mostrar el estado en el que se encuentra cada uno de los archivos respecto al control de versiones. Así te muestra información si se trata de un nuevo archivos, si existen cambios o si es un archivo ignorado. Por ejemplo,
$ exa -l --git -h
Permissions Size User Date Modified Git Name
drwxrwxr-x - lorenzo 29 ago 11:52 -I __pycache__
.rw-rw-r-- 2,9k lorenzo 30 ago 7:50 M- checkurl.py
.rw-rw-r-- 156 lorenzo 29 ago 9:04 -I env.json
.rw-rw-r-- 3,5k lorenzo 30 ago 7:49 -M monitor.py
.rw-rw-r-- 1,6k lorenzo 30 ago 7:51 -M telegramapi.py
.rw-rw-r-- 0 lorenzo 30 ago 7:52 -N test.py
.rw-rw-r-- 2,2k lorenzo 30 ago 7:51 -M test_monitoriza_url.py
Si te fijas en la columna de Git
aparece una combinación de dos caracteres. En el ejemplo son todos un guión mas una letra. En este caso,
I
ignoradoM
modificadoN
nuevo
Ahora en el caso de que el carácter esté a la izquierda indica que ya está en staging o preparado, mientras que si está a la derecha, está pendiente
Filtrado y orden
Otra característica que tiene exa, el reemplazo de ls, es la posibilidad de filtrar y ordenar los resultados. Esto de filtrar consiste en indicar que quieres que no se muestre. Así, por ejemplo si quisieras que no se mostrara ningún archivo cuyo nombre contenga monitor
, tienes que ejecutar la siguiente instrucción,
exa -l --ignore-glob=*monitor*
Además te permite utilizar varios patrones de filtrado. Para hacer esto, simplemente necesitas separar cada uno de los patrones que quieras pasar por |
, como en el ejemplo siguiente,
exa -l --ignore-glob="*monitor*|caso*"
Atributos extendidos
Además de todo lo que has visto hasta el momento, y si aún te parece poco, indicarte que exa
, el reemplazo de ls, te permite mostrar atributos adicionales, para lo que tienes que utilizar la opción --extended
.
Los atributos extendidos o xattrs
, es una forma de guardar información adicional en el sistema de archivos. Por regla general, el sistema de archivos solo es capaz de guardar un conjunto limitado de información para cada uno de los archivos, como puede ser el nombre del archivo, los permisos, la propiedad, fechas, etc. Sin embargo, utilizando los atributos extendidos esto puede aumentar considerablemente.
El siguiente paso es saber si tu sistema de archivos soporta los atributos extendidos, porque no todos los sistemas de archivos lo soportan. Los mas populares si que lo soportan EXT4, Btrfs, ReiserFS, JFS, y ZFS.
Por ejemplo,
$ exa -lh --git --extended
Permissions Size User Date Modified Git Name
.rw-rw-r-- 1,6k lorenzo 30 ago 7:51 -M telegramapi.py
.rw-rw-r--@ 0 lorenzo 30 ago 7:52 -N test.py
└── user.comment (len 18)
.rw-rw-r-- 2,2k lorenzo 30 ago 7:51 -M test_monitoriza_url.py
Si te fijas en la columna donde aparecen los permisos, para el caso del archivo test.py
, aparece el símbolo @
esto indica que ese archivo tiene atributos extendidos.
Instalación
Aunque puedes instalarlo directamente de la fuente, mi recomendación es que no te compliques la vida, y que te descargues el binario que está disponible en la página oficial de la aplicación. En el momento de preparar este podcast, esto era tan sencillo, como ejecutar las siguientes instrucciones en un terminal,
wget https://github.com/ogham/exa/releases/download/v0.9.0/exa-linux-x86_64-0.9.0.zip
unzip exa-linux-x86_64-0.9.0.zip
sudo mv exa-linux-x86_64 /usr/local/bin/exa
El inconveniente principal
Desde mi punto de vista, el inconveniente principal de esta herramienta es que no la vas a encontrar en las máquinas a las que te conectes, porque, como te puedes imaginar, no viene instalada por defecto, ni es sencillo de instalar, al menos a priori.
Mientras no se convierta en un estándar de facto, mientras no venga instalada por defecto en las máquinas con las que trabajes va a ser complicado que se convierta en el reemplazo de una herramienta tan implantada como es ls
.
Eso si, no está de mas que la tengas instalada en tu equipo personal para que veas como funciona, como se comporta y sobre todo las prestaciones y posibilidades que esta herramienta te ofrece.