Cómo utilizar el comando stat en Linux

El comando stat de Linux te muestra muchos más detalles de lo que hace ls. Debes echar un vistazo a profundidad a esta utilidad informativa y configurable. Te mostraremos cómo usarlo.

stat te muestra detalles a profundidad

El comando ls es excelente en lo que hace, y hace mucho, pero con Linux, parece que siempre hay una manera de profundizar y ver qué hay debajo de todo. Y a menudo, no se trata solo de levantar el borde de la alfombra. Puedes rasgar las tablas del piso y luego cavar un hoyo. Puedes desnudar Linux como una cebolla.

Ls te mostrará una gran cantidad de información sobre un archivo. Por ejemplo, qué permisos se establecieron en él, qué tan grande es y si es un archivo o un enlace simbólico. Para mostrar esta información, el comando ls lee de una estructura de sistema de archivos llamada inodo.

Cada archivo y directorio tiene un inodo. El inodo contiene metadatos sobre el archivo, como qué bloque de sistema de archivos ocupa y otros aspectos asociadas con el archivo. El inodo es como una tarjeta de biblioteca para el archivo. Pero ls solo te mostrará parte de la información. Para ver todo, necesitamos usar el comando stat.

Como ls, el comando stat tiene muchas opciones. Esto lo convierte en un gran candidato para el uso de alias. Una vez que hayas descubierto un conjunto particular de opciones que hacen que stat dé el resultado que deseas, empaquétalo en un alias o función de shell. Esto hace que sea mucho más conveniente de usar, y no tienes que recordar un conjunto arcano de opciones de línea de comandos.

Una comparación rápida

Usemos ls para mostrar una lista larga (opción -l) con tamaños de archivo legibles por humanos (opción -h):

De izquierda a derecha, la información que proporciona ls es:

  • El primer caracter es un guión “-” y esto nos dice que el archivo es un archivo normal y no un socket, un enlace simbólico u otro tipo de objeto.
  • El propietario, el grupo y otros permisos se enumeran en formato octal.
  • El número de enlaces duros que apuntan a este archivo. En este caso, y en la mayoría de los casos, será uno.
  • El propietario del archivo es Dave.
  • El dueño del grupo es Dave.
  • El tamaño del archivo es 802 bytes.
  • El archivo fue modificado por última vez el viernes 13 de diciembre de 2015.
  • El nombre del archivo es ana.c.

Echemos un vistazo con stat:

La información que obtenemos de stat es:

  • File: El nombre del archivo. Por lo general, es el mismo nombre que le asignamos stat en la línea de comandos, pero puede ser diferente si observamos un enlace simbólico.
  • Size: El tamaño del archivo en bytes.
  • Blocks: La cantidad de bloques del sistema de archivos que requiere el archivo para poder almacenarlos en el disco duro.
  • IO Block: El tamaño de un bloque de sistema de archivos.
  • File Type: El tipo de objeto que describen los metadatos. Los tipos más comunes son archivos y directorios, pero también pueden ser enlaces, sockets o tuberías con nombre.
  • Device: el número de dispositivo en hexadecimal y decimal. Este es el ID del disco duro en el que está almacenado el archivo.
  • Inode: El número de inodo. Es decir, el número de identificación de este inodo. Juntos, el número de inodo y el número de dispositivo identifican de forma exclusiva un archivo.
  • Links: Este número indica cuántos enlaces duros apuntan a este archivo. Cada enlace duro tiene su propio inodo. Entonces, otra forma de pensar en esta figura es cuántos inodes apuntan a este archivo. Cada vez que se crea o elimina un enlace duro, este número se ajustará hacia arriba o hacia abajo. Cuando llega a cero, el archivo se ha eliminado y se elimina el inodo. Si usas stat en un directorio, este número representa el número de archivos en el directorio, incluida la entrada “.” para el directorio actual y la entrada “..” para el directorio principal.
  • Access: Los permisos del archivo se muestran en sus formatos octal y tradicional rwx (lectura, escritura, ejecución).
  • Uid: ID de usuario y nombre de cuenta del propietario.
  • Gid: ID de grupo y nombre de cuenta del propietario.
  • Access:

El registro de tiempo de acceso. No es tan sencillo como parece. Las distribuciones modernas de Linux usan un esquema llamado relatime, que intenta optimizar las escrituras del disco duro necesarias para actualizar el tiempo de acceso. En pocas palabras, el tiempo de acceso se actualiza si es anterior al tiempo modificado.

  • Modify: el registro de tiempo de modificación. Este es el momento en que el contenido del archivo se modificó por última vez. (Por suerte, el contenido de este archivo se modificó por última vez hace cuatro años).
  • Change: el registro de tiempo de cambio. Esta es la hora en que se modificaron por última vez los atributos o el contenido del archivo. Si modificas un archivo estableciendo nuevos permisos de archivo, el registro de cambio se actualizará (porque los atributos del archivo han cambiado), pero el registro de tiempo de modificación no se actualizará (porque el contenido del archivo no se modificó).
  • Birth: Reservado para mostrar la fecha de creación original del archivo, pero esto no está implementado en Linux.

Comprendiendo los registros de tiempo

Los registros de tiempo son sensibles a la zona horaria. El -0500 final de cada línea muestra que este archivo se creó en una computadora en una zona horaria de tiempo universal coordinado (UTC).  Esta está cinco horas por delante de la zona horaria de la computadora actual.

Entonces, esta computadora está cinco horas retrasada con respecto de la computadora que creó este archivo. De hecho, el archivo se creó en una computadora de zona horaria del Reino Unido, y lo estamos viendo aquí en una computadora en la zona horaria del Este de EE. UU.

Los registros de tiempo de modificación y cambio pueden causar confusión porque, para los no entendidos, sus nombres suenan como si significaran lo mismo.

Usemos chmod para modificar los permisos de archivo en un archivo llamado ana.c. Vamos a hacer que todos puedan escribir en él. Esto no afectará el contenido del archivo, pero afectará los atributos del archivo.

Y luego usaremos stat para ver los registros de tiempo:

El registro de tiempo de cambio se ha actualizado, pero de modificación no.

La marca temporal o registro de tiempo modificado solo se actualizará si se cambia el contenido del archivo. El registro de tiempo de cambio se actualiza tanto para los cambios de contenido como para los cambios de atributos.

Usar stats con múltiples archivos

Para tener un informe estadístico (stat) en varios archivos a la vez, debes pasar los nombres de archivo a stat en la línea de comando:

Para usar stat en un conjunto de archivos, debes usar la coincidencia de patrones. El signo de interrogación “?” representa cualquier carácter individual, y el asterisco “*” representa cualquier cadena de caracteres. Podemos decir que stat informará sobre cualquier archivo llamado “ana” con una sola extensión de letra, con este comando:

Uso de stat para reportes sobre sistemas de archivos

stat puede informar sobre el estado del sistema de archivos, así como el estado de los archivos. La opción –f (sistema de archivos) le dice a stat que informe sobre el sistema de archivos en el que reside el archivo. Ten en cuenta que también podemos pasar un directorio como “/” a stat en lugar de un nombre de archivo.

La información que stat nos brinda es:

  • File: El nombre del archivo.
  • ID: El ID del sistema de archivos en notación hexadecimal.
  • Namelen: La longitud máxima permitida para los nombres de archivo.
  • Type: El tipo de sistema de archivos.
  • Block size: La cantidad de datos para solicitar peticiones de lectura para tasas de transferencia de datos óptimas.
  • Fundamental block size: el tamaño de cada bloque del sistema de archivos.

Bloques:

  • Total: El recuento total de todos los bloques en el sistema de archivos.
  • Free: El número de bloques libres en el sistema de archivos.
  • Available: La cantidad de bloques libres disponibles para usuarios normales (no root).

Inodos:

  • Total: El recuento total de inodos en el sistema de archivos.
  • Free: el número de inodos libres en el sistema de archivos.

Desreferencia de enlaces simbólicos

Si usa stat en un archivo que en realidad es un enlace simbólico, informará sobre el enlace. Si deseas que stat informé sobre el archivo al que apunta el enlace, debes usar la opción –L (desreferenciar). El archivo code.c es un enlace simbólico a ana.c. Echemos un vistazo sin la opción –L:

El nombre del archivo muestra code.c apuntando a (->) ana.c. El tamaño del archivo es de solo 11 bytes. Hay cero bloques dedicados a almacenar este enlace. El tipo de archivo aparece como un enlace simbólico.

Claramente, no estamos viendo el archivo real aquí. Hagamos eso nuevamente y agreguemos la opción –L:

Esto ahora muestra los detalles del archivo al que apunta el enlace simbólico. Pero ten en cuenta que el nombre de archivo todavía se muestra como code.c. Este es el nombre del enlace, no el archivo de destino. Esto sucede porque este es el nombre al que pasamos a stat en la línea de comandos.

El informe breve

La opción –t (breve) hace que stat proporcione un resumen breve:

No hay mayor información. Para darle sentido, hasta que hayas memorizado la secuencia de campo, debes hacer una referencia cruzada de esta salida a una salida de stat completa.

Formatos de salida personalizados

Una mejor manera de obtener un conjunto diferente de datos de stat es utilizar un formato personalizado. Hay una larga lista de tokens llamados secuencias de formato. Cada uno de estos representa un elemento de datos. Debes seleccionar los que deseas incluir en la salida y crear una cadena de formato. Cuando llamamos a stat y le pasamos la cadena de formato, la salida solo incluirá los elementos de datos que solicitamos.

Existen diferentes conjuntos de secuencias de formato para archivos y sistemas de archivos. La lista de archivos es:

  • %a: Los permisos de acceso en octal.
  • %A: Los permisos de acceso en forma legible por humanos (rwx).
  • %b: El número de bloques asignados.
  • %B: El tamaño en bytes de cada bloque.
  • %d: El número de dispositivo en decimal.
  • %D: El número de dispositivo en hexadecimal.
  • %f: El modo sin formato en hexadecimal.
  • %F: El tipo de archivo.
  • %g: El ID de grupo del propietario.
  • %G:

El nombre del grupo del propietario.

  • %h: La cantidad de enlaces duros.
  • %i: El número de inodo.
  • %m: El punto de montaje.
  • %n: El nombre del archivo.
  • %N: El nombre del archivo citado, con un nombre de archivo desreferenciado si es un enlace simbólico.
  • %o: La sugerencia de tamaño de transferencia de E/S óptima.
  • %s: El tamaño total, en bytes.
  • %t: El tipo de dispositivo principal en hexadecimal, para archivos especiales de dispositivo de caracteres/bloque.
  • %T: El tipo de dispositivo menor en hexadecimal, para archivos especiales de caracteres/dispositivos de bloque.
  • %u: El ID de usuario del propietario.
  • %U: El nombre de usuario del propietario.
  • %w: La hora de creación del archivo, legible por humanos o un guion “-” si se desconoce.
  • %W: El tiempo de creación del archivo, segundos desde la época; 0 si se desconoce.
  • %x: La hora del último acceso, legible por humanos.
  • %X: El tiempo del último acceso, segundos desde la época.
  • %y: El momento de la última modificación de datos, legible por humanos.
  • %Y: El tiempo de la última modificación de datos, segundos desde la época.
  • %z: La hora del último cambio de estado, legible por humanos.
  • %Z: La hora del último cambio de estado, segundos desde la época.

“Época” es Unix Epoch, que tuvo lugar el 1970-01-01 00:00:00 +0000 (UTC).

Para los sistemas de archivos, las secuencias de formato son:

  • %a: La cantidad de bloques libres disponibles para usuarios normales (no root).
  • %b: El total de bloques de datos en el sistema de archivos.
  • %c: Los inodos totales en el sistema de archivos.
  • %d: El número de inodos libres en el sistema de archivos.
  • %f: El número de bloques libres en el sistema de archivos.
  • %i: El ID del sistema de archivos en hexadecimal.
  • %l: La longitud máxima de los nombres de archivo.
  • %n: El nombre del archivo.
  • %s: El tamaño del bloque (el tamaño de escritura óptimo).
  • %S: El tamaño de los bloques del sistema de archivos (para recuentos de bloques).
  • %t: El tipo de sistema de archivos en hexadecimal.
  • %T: Tipo de sistema de archivos en forma legible para humanos.

Hay dos opciones que aceptan cadenas de secuencias de formato. Estos son –format y –printf. La diferencia entre ellos es –printf interpreta secuencias de escape de estilo C como nueva línea \n y tabulación \t, y no agrega automáticamente un carácter de nueva línea a su salida.

Creemos una cadena de formato y se la pasamos stat. Las secuencias de formato que se iban a utilizar son %n para nombre de archivo, %s para el tamaño del archivo. También %F para el tipo de archivo. Vamos a agregar la secuencia \n de escape al final de la cadena para asegurarnos de que cada archivo se maneje en una nueva línea. Nuestra cadena de formato se ve así:

Vamos a pasar esto a stat usando la opción –printf. Vamos a pedir a stat informar sobre un archivo llamado code.c y un conjunto de archivos que coinciden con ana.?. Este es el comando completo. Ten en cuenta el signo igual “=” entre –printf y la cadena de formato:

Resultado

El reporte para cada archivo aparece en una nueva línea, que es lo que solicitamos. El nombre de archivo, el tamaño del archivo y el tipo de archivo se nos muestran.

Los formatos personalizados te dan acceso a aún más elementos de datos que los que se incluyen en la salida estándar de stat.

Control exhaustivo

Como puedes ver, existe un enorme alcance para extraer los elementos de datos particulares que te interesan. Probablemente también puedas ver por qué recomendamos utilizar alias para los requerimientos más largos y complejos.