3 puntos por GN⁺ 2024-07-23 | 1 comentarios | Compartir por WhatsApp
  • eza es una herramienta CLI moderna que reemplaza el comando de listado de archivos ls de Unix/Linux, con el objetivo de ofrecer más funciones y mejores valores predeterminados
  • Distingue los tipos de archivo y los metadatos con colores, reconoce enlaces simbólicos, atributos extendidos e información de Git, y se distribuye como un binario único pequeño y rápido
  • Frente a exa, agrega correcciones para el Grid Bug, hipervínculos, detalles de puntos de montaje, contexto de SELinux, estado de repositorios Git, fechas relativas legibles para humanos, correcciones de seguridad, colores de terminal bright y configuración mediante theme.yml
  • Puede instalarse en Windows, macOS y Linux, y en entornos con Nix flake se puede compilar y ejecutar con nix run github:eza-community/eza
  • Tiene un sistema de opciones similar a ls, aunque no idéntico, y permite ajustar en detalle la forma de mostrar listados mediante opciones de visualización, filtrado, listado largo y configuración de temas

La experiencia de reemplazo de ls que ofrece eza

  • eza es una alternativa moderna al antiguo comando de listado de archivos ls incluido en los sistemas operativos Unix y Linux
  • Su objetivo principal es ofrecer una versión con más funciones y más amigable para el usuario que ls
  • Distingue los tipos de archivo y los metadatos con colores
  • Reconoce enlaces simbólicos, atributos extendidos e información de Git
  • Es pequeño, rápido y se distribuye como un binario único

Funciones agregadas frente a exa

  • eza incluye muchas funciones que no estaban en exa
    • Corrección de “The Grid Bug”, introducido en exa 2021
    • Soporte para hipervínculos
    • Salida con detalles de puntos de montaje
    • Salida con contexto de SELinux
    • Salida con estado de repositorios Git
    • Fechas relativas legibles para humanos
    • Varias correcciones de seguridad
    • Soporte para colores de terminal bright
    • Correcciones menores de errores y otros cambios
    • Archivo de configuración theme.yml para personalizar colores e íconos

Ejecución e instalación

  • En entornos con soporte para Nix flake, puedes probar eza con el siguiente comando
    • nix run github:eza-community/eza
  • Nix compila eza y luego lo ejecuta
  • Para pasar argumentos, agrega las opciones después de --
    • nix run github:eza-community/eza -- -ol
  • eza puede usarse en Windows, macOS y Linux
  • Los métodos de instalación por plataforma y distribución están en INSTALL.md

Estructura de las opciones de línea de comandos

  • Las opciones de eza son muy parecidas a las de ls, pero no exactamente iguales
  • Opciones de visualización

    • -1, --oneline: muestra un elemento por línea
    • -G, --grid: muestra los elementos en una cuadrícula y es el valor predeterminado
    • -l, --long: muestra detalles y atributos ampliados
    • -R, --recurse: recorre directorios de forma recursiva
    • -T, --tree: muestra directorios en forma de árbol de manera recursiva
    • -F, --classify=(when): muestra indicadores de tipo junto al nombre del archivo
    • --colour=(when), --color=(when): especifica cuándo usar colores de terminal
    • --icons=(when): especifica cuándo mostrar íconos
    • --hyperlink=(when): especifica cuándo mostrar elementos como hipervínculos
    • --absolute=(mode): especifica cómo mostrar la ruta absoluta de los elementos
  • Opciones de filtrado

    • -a, --all: muestra archivos ocultos y archivos dot
    • -d, --treat-dirs-as-files: lista los directorios como si fueran archivos normales
    • -L, --level=(depth): limita la profundidad de la recursión
    • -s, --sort=(field): especifica el campo de ordenamiento
    • --group-directories-first: muestra primero los directorios
    • --group-directories-last: muestra los directorios al final
    • -D, --only-dirs: muestra solo directorios
    • -f, --only-files: muestra solo archivos
    • --git-ignore: ignora archivos presentes en .gitignore
    • -I, --ignore-glob=(globs): ignora archivos según patrones glob separados por |
    • Si se pasa --all dos veces, también se muestran los directorios . y ..

Listado largo e información relacionada con Git

  • Al usar --long o -l, se pueden usar las opciones de listado largo
  • Ofrece opciones relacionadas con tamaño de archivo y permisos
    • -b, --binary: muestra tamaños de archivo con prefijos binarios
    • -B, --bytes: muestra tamaños de archivo en bytes sin prefijos
    • -o, --octal-permissions: muestra los permisos en formato octal
    • --no-permissions, --no-filesize, --no-user, --no-time: omite la salida de cada campo correspondiente
  • Ofrece opciones relacionadas con sistema de archivos y metadatos
    • -H, --links: muestra la cantidad de enlaces duros
    • -i, --inode: muestra el número de inode
    • -M, --mounts: muestra detalles de montaje, disponible solo en Linux y macOS
    • -Z, --context: muestra el contexto de seguridad
    • -@, --extended: muestra atributos extendidos y tamaño
    • --total-size: muestra el tamaño de directorios recursivos
  • También admite salida relacionada con Git
    • --git: muestra el estado de Git de cada archivo rastreado o ignorado
    • --git-repos: muestra el estado de Git de cada directorio rastreado
    • --git-repos-no-status: solo muestra si un directorio es un repositorio Git y es más rápido
    • --no-git: ignora siempre --git, --git-repos y --git-repos-no-status, y suprime la salida del estado de Git
  • El formato de hora admite default, iso, long-iso, full-iso, relative o un formato personalizado con la forma +<FORMAT>
    • Ejemplo: +%Y-%m-%d %H:%M produce una salida como 2023-09-30 13:00
    • Para más detalles sobre las cadenas de formato, consulta la página de manual eza(1) y la documentación de chrono
  • La página de manual puede verse en el directorio man del repositorio, y desde la versión [0.18.13] - 2024-04-25 también puede usarse desde la terminal con man eza

Personalización de temas

  • eza agregó recientemente soporte para archivos theme.yml
  • En theme.yml se pueden definir las opciones de tema existentes que antes podían usarse en las variables de entorno LS_COLORS y EXA_COLORS
  • También ofrece opciones para asignar íconos distintos según el tipo de archivo y la extensión
  • Si las variables de entorno existentes ya están configuradas, siguen funcionando por compatibilidad hacia atrás y tienen prioridad
  • Los temas ya preparados pueden revisarse en el repositorio oficial eza-themes o puedes contribuir con los tuyos
  • El archivo de tema de ejemplo está en docs/theme.yml
  • El archivo de tema puede colocarse en el directorio definido por la variable de entorno EZA_CONFIG_DIR, o de forma predeterminada se busca en $XDG_CONFIG_HOME/eza
  • Para más detalles, consulta eza_colors-explanation.5.md y docs/theme.yml

Contribuciones

1 comentarios

 
GN⁺ 2024-07-23
Comentarios de Hacker News
  • En los listados de directorios, las fechas legibles para humanos me molestan especialmente.
    Si estoy buscando algo que copié a una carpeta ayer alrededor de las 11 a. m. y todo aparece como “1 day ago”, no ayuda. Necesito la fecha y la hora; y lo mismo aplica a foros como HN: que muestren primero la fecha/hora exacta y, si hace falta, agreguen también “7 hours ago”.
    No entiendo por qué se elimina información a propósito, y me pregunto si es consecuencia de tendencias como el desplazamiento infinito.

    • De acuerdo. GitHub también muestra cosas como “foo.cpp modified last year” en los commits, y si no hay forma de ver información adicional de fecha/hora, no tiene ningún sentido.
    • Creo que los sitios podrían usar una etiqueta HTML para esto. Aunque elijan un formato legible para humanos, si conservan la hora real, una extensión podría reemplazarlo o superponerlo.
      Intento usarla siempre que escribo HTML.
      (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ti...)
    • Es una anti-función realmente sorprendente. El momento en que cambia también es ambiguo. ¿Cuándo pasa “1 day ago” a ser “2 days ago”? Según Google, después de 48 horas; entonces, si lo ves 47 horas después, aparece “1 day ago” y te hace pensar que ocurrió ayer.
      Aunque recuerdes que una fecha específica fue el día después del cumpleaños de un amigo e intentes encontrar un elemento, si lo único que se muestra es “three months ago”, tienes que revisar material de todo un mes.
    • Esto es configurable, así que se puede cambiar al formato de fecha que quieras.
    • No me gusta este enfoque. Parece haber empezado con las startups de la Web 2.0, o haberse difundido por esa época desde aplicaciones web/aplicaciones web sociales de empresas como Google.
      Basta con dar primero la hora detallada y, si se quiere, mostrar también “hace unos días”.
  • También existe lsd, pero sigo prefiriendo eza.
    Para quienes estén interesados, estos son algunos comandos modernos que hoy uso en lugar de herramientas antiguas: bat es cat con resaltado de sintaxis; difftastic es un diff mejor; gdu es ncdu para SSD; zoxide es un cd moderno; fd es una alternativa a find; rg es ripgrep; fzf es un buscador difuso; jless es un visor de JSON con plegado mediante mouse; dra descarga/instala recursos de releases; lazygit es una TUI para Git; lazydocker es una TUI para Docker; yazi es un gestor de archivos con vista previa de imágenes; zellij es un mejor tmux/screen; starship es una herramienta de configuración del prompt para varias shells.

    • Agregaría cuatro herramientas que uso mucho: task es una alternativa a Makefile; hyperfine es una herramienta de benchmark; vegeta es una herramienta de pruebas de carga; sd es un sed mejor y más intuitivo.
      También está el trío de JSON: jq es el conocido procesador de JSON; jc convierte la salida de varias herramientas CLI a JSON; gron hace que JSON sea más fácil de usar con grep.
    • Hay que tener cuidado con que fd y rg ignoran de forma predeterminada los elementos incluidos en .gitignore. Si piensas que son simples reemplazos de find, puede sorprenderte. La discusión relacionada está en [0].
      Al recomendar estas herramientas, hay que dejar esto claro. Es fácil pasarlo por alto si no lees la documentación. Personalmente, me gustaría que este tipo de reemplazos de coreutils mantuvieran valores predeterminados más parecidos a las herramientas originales. Si se promocionan como “una alternativa simple, rápida y fácil de usar a find”, deberían respetar los valores predeterminados del original para reducir las sorpresas de los nuevos usuarios. Como existen los alias, creo que es mejor poner alias fd='fd --ignore' en ~/.${SHELL##*/}rc que alias fd='fd --no-ignore'.
      Como consejo: si quieres usar la versión sin el alias aplicado, puedes usar \command. Por ejemplo, uso alias grep='grep --color=always --no-messages --binary-files=without-match, pero la opción de color cambia la representación de los caracteres y puede causar errores si lo canalizas a curl. No pasa en todos los pipes, pero cuando lo encuentras por primera vez puede desconcertar bastante. Se puede comprobar con echo "Hello world" | \grep --color=always "Hello" | hexdump y luego !!:s^always^never.
      [0] https://github.com/sharkdp/fd/issues/612
    • En este enlace también hay una gran lista de herramientas adicionales de las que no había oído hablar, pero que se ven interesantes.
      https://github.com/ibraheemdev/modern-unix
    • Me gusta que la mayoría de estas herramientas estén escritas en Rust.
    • No sentí que zellij fuera mejor que screen. Las pestañas/pantallas no se numeran correctamente, así que para cambiar directamente tengo que contarlas a mano, y eso me cuesta aceptarlo.
  • GNU ls sí recibe mantenimiento. Hubo commits que afectaron al archivo ls.c incluso el 2024-06-24 y el 2024-06-27, hace menos de un mes.
    La lista de correo de GNU Coreutils también es bastante activa. Parece que este proyecto usa “maintained” con el sentido de “en desarrollo activo”.

    • Parece que aquí se refieren a exa, el proyecto del que eza es un fork. exa estuvo sin mantenimiento durante aproximadamente un año antes de que la única persona con permisos de escritura en el repositorio lo marcara oficialmente como deprecated.
      Ya pasó bastante tiempo desde el fork, así que no todos conocen exa, y la intención de esa frase se volvió mucho menos clara. Como hay reacciones parecidas, creo que ya es momento de actualizar el texto.
    • Aquí “maintained” no significa que ls no reciba mantenimiento, sino que se trata de un reemplazo mantenido como fork de exa, un reemplazo de ls que ya no se mantiene.
  • Después de cambiarme al shell fish, mi uso de ls bajó 100%. El comando integrado Alt + l muestra el contenido del directorio, así que es muy útil, y el historial del shell también queda más limpio.

    • En Bash también se puede mantener más limpio el historial si agregas comandos como ls a la variable de entorno HISTIGNORE: https://superuser.com/questions/232885/can-you-share-wisdom-...
    • Buen tip. Lo que eliminó la mayor parte de mi uso de ls en fish fue una configuración para ejecutar ls automáticamente al cambiar de directorio
      function ls_on_cd --on-variable PWD
      ls
      end
    • Los usuarios de Bash también pueden vincular atajos de teclado de esta forma. Tengo las teclas de la fila base de la mano derecha enlazadas a funciones como __bash_ctrl_n(), y varias herramientas de mis dotfiles sobrescriben esas funciones. Por ejemplo, si Git está instalado, configuro __bash_ctrl_e() para que ejecute git status y git log.
    • En mi entorno, probablemente porque tengo ls como alias de eza, esta función parece ejecutar eza. Al final parece que simplemente ejecuta ls.
    • Me di cuenta de que la mayoría de las veces que ejecutaba ls era justo después de cd, así que lo agregué a mis archivos de inicio. Ahora casi todos los cd ejecutan ls automáticamente
      En Bash, en una función cd() llamo a builtin cd "$@" && ls -l; en fish, después de builtin cd $argv, si no hay error y no es un cambio al home, ejecuto dir.
  • En general me resultan incómodas las herramientas de terminal que imponen colores para distinguir tipos o atributos de archivos. El ls de muchas distribuciones también viene configurado así, pero yo elimino esa configuración y uso los valores predeterminados
    Uso un fondo de terminal cómodo para la vista, y estos esquemas de color siempre chocan con el fondo o incluyen colores difíciles de leer. No necesito colores en la salida de ls ni de sus reemplazos; con lo que ofrece ls -AFC es suficiente.

    • Si las herramientas usaran Base16 Framework[0] en vez de modos de color arbitrarios de “256 color” o “RGB”, sería un problema mucho menor. La salida se mostraría con los colores definidos por la terminal, que se supone que son legibles
      [0] https://github.com/chriskempson/base16
      [1] https://tinted-theming.github.io/base16-gallery/
    • Yo soy totalmente lo contrario: dependo mucho de la salida coloreada
      Aun así, debería haber una solución, y basta con establecer algún valor en $NO_COLOR. https://no-color.org
      Es completamente razonable abrir un reporte de bug para las herramientas que no revisan y respetan esta variable de entorno.
    • https://no-color.org
    • Puedes usar vivid[1] para elegir un tema que combine con el fondo de tu terminal y cargar en el shell la variable LS_COLORS generada
      [1]: https://github.com/sharkdp/vivid/
  • Es raro que el README no diga que eza es un fork de exa.

    • Sí menciona su existencia con “eza features not in exa”. Pero no hay enlace ni contexto.
  • Me pregunto por qué tantas versiones nuevas de utilidades GNU se están haciendo con licencia MIT. Parece que son bastantes.

    • En general, los usuarios de Rust tienden a publicar su código con licencias permisivas. No sé si hay estadísticas fáciles de consultar, pero casi todo en crates.io, el repositorio de paquetes de Rust, es MIT o Apache-2.0, y diría que las bibliotecas populares definitivamente lo son.
    • El proyecto GNU no inventó ls. GNU coreutils, que incluye ls, también fue originalmente una nueva versión de utilidades propietarias de AT&T o de utilidades con licencia BSD.
    • Relacionado con eso, https://github.com/uutils/coreutils es una “reescritura multiplataforma en Rust de GNU coreutils”.
  • ¿Por qué un reemplazo de ls necesita Kerberos y SSH?
    Si miras ldd /usr/bin/eza, está enlazado con bastantes bibliotecas como libgit2, libgssapi_krb5, libmbedtls, libssh2, libkrb5, libcrypto, libzstd, etc.

    • Justo para algo que necesita ls, son demasiadas dependencias.
  • En un teclado QWERTY, eza es una combinación de tres letras bastante horrible. Una de las ventajas de ls es que es una combinación de teclas que se puede escribir muy rápido
    Podría crear un alias, pero por razones como la compatibilidad se siente un poco raro.

    • Desde alrededor de 2015 tengo eza, y antes exa, como alias de ls, ll y lll, y nunca tuve problemas de compatibilidad
      También tengo instalado sl para entrenarme a no teclearlo mal.
    • Para usuarios de Dvorak, eza parece una mejora. En Dvorak, ls equivale a p- en QWERTY, así que ambas son teclas del meñique derecho.
    • ¿Podrías explicar un poco más por qué te parece raro usar un alias?
    • Puedes crear un alias con el nombre que quieras.
    • En momentos así es cuando un teclado AZERTY brilla
  • Al final, ¿quién usa ls? Solo uso el autocompletado con Tab hasta que aparezca el archivo que necesito
    Bromas aparte, me da curiosidad por qué afirman que ls ya no recibe mantenimiento

    • Parece que no se refieren a ls, sino a exa[0], que ya no recibe mantenimiento
      [0]https://github.com/ogham/exa
    • Por alguna razón, se volvió casi la norma pensar que si un software no se actualiza regularmente, entonces por naturaleza está obsoleto
    • Por supuesto, ls se mantiene como parte del shell o de coreutils
      Solo que eza es una variante de exa, y hasta donde sé, exa ya no recibe mantenimiento
    • Están confundiendo deliberadamente “maintained” con “actively developed” para hacer parecer que las herramientas existentes no reciben mantenimiento