El comando stat en Linux: ver información detallada de archivos

Introducción

En el día a día de un administrador de sistemas o un desarrollador que trabaja en entornos Linux, conocer los metadatos de un archivo es tan importante como saber su contenido. Mientras que comandos como ls o find nos dan una visión general, el comando stat nos permite profundizar y extraer información detallada que a menudo pasa desapercibida. En este artículo exploraremos qué es stat, cómo funciona su sintaxis, qué opciones ofrece y cómo interpretar cada uno de los campos que devuelve.

¿Qué es stat?

El comando stat pertenece al paquete de utilidades básicas de GNU coreutils y se encarga de mostrar el estado de un archivo o sistema de archivos. A diferencia de ls -l, que muestra un formato legible pero limitado, stat presenta todos los atributos que el kernel mantiene en el inodo: permisos, número de enlaces, propietario, grupo, tamaño, bloques asignados, y los diversos timestamps (acceso, modificación y cambio de estado). Además, permite al usuario definir un formato de salida personalizado mediante la opción -c o --format, lo que lo convierte en una herramienta muy flexible para scripts y automatización.

Sintaxis básica

La forma más simple de usar stat es:

stat [opciones] archivo

Si no se especifica ninguna opción, el comando muestra una salida predeterminada dividida en bloques: información del archivo, del sistema de archivos donde reside y, opcionalmente, de cualquier enlace simbólico que se siga. Algunas de las opciones más comunes son:

  • -L o --dereference: sigue enlaces simbólicos y muestra la información del archivo al que apuntan.
  • -f o --file-system: muestra estadísticas del sistema de archivos en lugar del archivo.
  • -c FORMAT o --format=FORMAT: define un formato de salida personalizado usando secuencias de escape.
  • -t o --terse: salida en forma compacta, útil para procesamiento posterior.

Opciones de formato más útiles

La verdadera potencia de stat reside en su capacidad de formatear la salida. A continuación se listan algunas de las secuencias de escape más utilizadas:

  • %n: nombre del archivo.
  • %s: tamaño total en bytes.
  • %U: nombre del propietario.
  • %G: nombre del grupo.
  • %a: permisos en formato octal (ej. 755).
  • %A: permisos en formato legible (ej. -rwxr-xr-x).
  • %X: tiempo de último acceso en segundos desde la época.
  • %Y: tiempo de última modificación en segundos desde la época.
  • %Z: tiempo de último cambio de estado (inodo) en segundos desde la época.
  • %x, %y, %z: mismos tiempos pero en formato legible legible por humanos.
  • %b: número de bloques asignados.
  • %B: tamaño en bytes de cada bloque (usualmente 512).
  • %F: tipo de archivo (regular file, directory, symbolic link, etc.).

Ejemplos prácticos

Para ilustrar el uso de stat, veamos varios escenarios comunes:

  • Información básica de un archivo:
    stat /etc/passwd

    Esto mostrará la salida completa con todos los campos predeterminados.

  • Obtener solo el tamaño y los permisos:
    stat -c "%n %s bytes %a" /etc/passwd

    Resultado: /etc/passwd 1234 bytes 644.

  • Mostrar la fecha de última modificación en formato legible:
    stat -c "%n se modificó el %y" /var/log/syslog
  • Seguir un enlace simbólico:
    stat -L /usr/bin/python3

    Esto mostrará los datos del binario real al que apunta el enlace, no del propio enlace.

  • Obtener información del sistema de archivos donde reside un directorio:
    stat -f /home

    Veremos el tipo de sistema de archivos, el número total de bloques, bloques libres, etc.

Interpretación de los campos más importantes

Entender qué significa cada campo ayuda a diagnosticar problemas de permisos, rendimiento o integridad.

  • Inodo: número interno que identifica de forma única el archivo dentro del sistema de archivos. Dos enlaces duros al mismo archivo comparten el mismo inodo.
  • Enlaces (hard links): cuenta de cuántos nombres de archivo apuntan al mismo inodo. Un valor de 1 indica que solo existe ese nombre.
  • Tamaño: número de bytes que ocupa el contenido del archivo. Para directorios, refleja el espacio usado para almacenar la lista de entradas.
  • Bloques: número de bloques de disco asignados. Puede ser mayor que el tamaño dividido por el bloque debido a asignaciones internas y fragmentación.
  • Timestamps:
    • Acceso (%X / %x): última vez que el archivo fue leído.
    • Modificación (%Y / %y): última vez que el contenido del archivo fue escrito.
    • Cambio de estado (%Z / %z): última vez que el inodo fue modificado (permisos, propietario, enlaces, etc.). Este timestamp cambia incluso si el contenido no varía.

Stat vs. ls -l

Aunque ls -l es más rápido para una vista resumida, stat ofrece ventajas claras cuando se necesita precisión o se va a procesar la salida en un script:

  • Consistencia: la salida de stat no depende de la configuración regional ni de ancho de terminal; los campos numéricos son siempre los mismos.
  • Flexibilidad de formato: con -c podemos extraer exactamente los datos que necesitamos, evitando tener que hacer parsing de columnas.
  • Información del sistema de archivos: ls no puede mostrar datos del sistema de archivos donde reside el archivo; para eso se necesita stat -f o df.
  • Seguimiento de enlaces: la opción -L de stat es más explícita que la -L de ls y funciona igualmente bien con la opción de formato.

Conclusión

El comando stat es una herramienta esencial para cualquier persona que trabaje con Linux y necesite obtener información detallada y confiable sobre archivos y sistemas de archivos. Su capacidad para mostrar todos los atributos del inodo, combinada con la potencia de la personalización de formato, lo convierte en una alternativa superior a ls cuando se requiere precisión o automatización. Dominar sus opciones y comprender el significado de cada campo le permitirá diagnosticar problemas de permisos, auditoría de cambios y optimización de almacenamiento con mayor eficacia.