Linux / Comando / stat: consultar tamaños, permisos, inodos y fechas
stat es un comando que muestra detalladamente el tamaño, permisos, propietario, inode, número de enlaces duros, bloques asignados y varias marcas de tiempo de archivos o directorios. Se puede comprobar más metadatos que con ls -l, y es útil para scripts de shell porque puede mostrar solo los campos deseados en un formato consistente.
En este artículo, se explica cómo leer la salida básica de stat de GNU Coreutils, la diferencia entre atime·mtime·ctime·Birth, los enlaces simbólicos, la información del sistema de archivos y cómo utilizar --format.
¿Qué es el comando stat?
stat consulta la información de estado gestionada por el sistema de archivos, es decir, los metadatos, no el contenido del archivo. Solo necesita especificar como argumento los archivos o directorios a inspeccionar.
stat report.txt
stat /etc
stat /usr/bin/bash
Es diferente del comando file que lee directamente archivos y analiza su contenido. file estima el formato, y stat muestra información del sistema de archivos como tamaño, permisos, propiedad, tiempo y inode.
Sintaxis y uso básico
stat [OPCIONES] ARCHIVO ...
No solo se puede especificar un archivo, sino también varias rutas a la vez.
stat file1.txt file2.txt
stat src tests
stat "annual report.pdf"
Los nombres de archivos que empiezan con un guion deben especificarse después de -- para que no se confundan con opciones.
stat -- -sample.txt
La versión de GNU stat y las opciones soportadas se pueden verificar con el siguiente comando.
stat --version
stat --help
info '(coreutils) stat invocation'
Cómo leer la salida básica
Al ejecutar stat en un archivo normal, aparecerá información similar a la siguiente. Los valores reales y algunos campos pueden variar según el sistema de archivos y el sistema operativo.
File: report.txt
Size: 4096 Blocks: 8 IO Block: 4096 regular file
Device: 8,1 Inode: 1234567 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2026-09-21 10:15:30.000000000 +0900
Modify: 2026-09-21 10:14:02.000000000 +0900
Change: 2026-09-21 10:14:02.000000000 +0900
Birth: 2026-09-20 19:42:11.000000000 +0900
Cada elemento tiene el siguiente significado.
| Elemento | Significado |
|---|---|
File |
El nombre del archivo o directorio consultado. |
Size |
El tamaño lógico del archivo. Generalmente se muestra en bytes. |
Blocks |
El número de bloques asignados al archivo. En archivos dispersos o en sistemas de archivos comprimidos, la diferencia entre el tamaño lógico y la asignación real puede ser grande. |
IO Block |
Información sobre el tamaño de bloque recomendado para una E/S eficiente. |
Device |
El número que identifica el dispositivo al que pertenece el archivo. |
Inode |
Es el número de inode que identifica los metadatos del archivo dentro de ese sistema de archivos. |
Links |
Es el número de enlaces duros que apuntan al mismo inode. |
Access |
Muestra los permisos y el tipo de archivo en forma octal y simbólica. |
Uid, Gid |
Es el ID numérico y el nombre del usuario propietario y del grupo. |
Access, Modify, Change, Birth |
Son las marcas de tiempo sobre acceso, modificación del contenido, cambio de estado y creación. |
La diferencia entre ls -l y stat
| Elementos de comparación | ls -l |
stat |
|---|---|---|
| Objetivo principal | Compara rápidamente varios archivos en forma de lista. | Comprueba los metadatos detallados del archivo especificado. |
| Hora básica | Principalmente muestra de manera resumida la hora de modificación. | Muestra de forma diferenciada la hora de acceso, modificación, cambio de estado y creación. |
| inode y bloques | Debe agregar opciones para ver cierta información. | Muestra en la salida básica el inode, el número de enlaces, bloques asignados, etc. |
| Salida de script | El análisis de listas legibles por humanos puede ser inestable según el entorno. | Puede especificar directamente los campos necesarios con --format. |
| Información del sistema de archivos | No se proporciona directamente. | Muestra el estado del sistema de archivos donde se encuentra el archivo con -f. |
Al examinar nombres, tamaños y permisos de varios archivos, ls -l es conveniente, y si necesita valores precisos de campos individuales de un archivo o para automatización, stat es adecuado.
Comprendiendo el tamaño del archivo y los bloques asignados
Verificando el tamaño lógico
El Size en la salida predeterminada representa el número total de bytes que contiene el archivo. Para mostrar solo el valor necesario, use %s.
stat -c '%s' disk.img
stat -c '%n: %s bytes' file1 file2
El Size de un directorio no es la suma de todos los archivos dentro de él. Es el tamaño del propio directorio que almacena las entradas de directorio. El uso total del contenido subordinado se puede verificar con du.
Calcular el espacio asignado
%b muestra el número de bloques asignados y %B muestra el tamaño en bytes de cada bloque.
stat -c 'size=%s blocks=%b block-size=%B' disk.img
El número aproximado de bytes asignados se puede calcular con %b × %B. Los archivos dispersos pueden tener mucho menos espacio físicamente asignado que su tamaño lógico, y si hay funciones como compresión del sistema de archivos o bloques compartidos, es difícil determinar el uso del dispositivo de almacenamiento físico solo con este valor.
Verificar permisos y propietario
Mostrar permisos en formato octal y simbólico
%a muestra los permisos en formato octal y %A muestra los permisos legibles por humanos, incluyendo el tipo de archivo.
stat -c '%a %A %n' script.sh
La salida puede tener la siguiente forma.
755 -rwxr-xr-x script.sh
Mostrar propietario y grupo
%U y %G muestran el nombre de usuario y el nombre del grupo, mientras que %u y %g muestran el UID y GID numéricos.
stat -c 'owner=%U(%u) group=%G(%g)' report.txt
En un entorno donde no se puede encontrar un nombre correspondiente al ID numérico, el campo de nombre puede mostrarse de manera diferente.
Verificar inode y enlaces duros
Mostrar número de inode
%i muestra el número de inode que identifica un archivo dentro del sistema de archivos.
stat -c '%i %n' report.txt
Los números de inode no son globalmente únicos a través de los límites del sistema de archivos. Para comparar si dos archivos son el mismo, se debe considerar la información del dispositivo junto con el inode.
Comprobar el número de enlaces duros
%h es el número de enlaces duros que apuntan a ese inode.
stat -c 'inode=%i links=%h name=%n' original.txt copy-link.txt
Si el dispositivo y el inode de dos rutas son los mismos, podrían ser enlaces duros que apuntan a los mismos datos de archivo. Los enlaces simbólicos tienen un inode separado, por lo que no se juzgan de la misma manera.
Diferencias entre atime, mtime, ctime y Birth
Los nombres de las marcas de tiempo son similares, pero registran eventos diferentes. En particular, es importante no confundir ctime con la hora de creación.
| Tiempo | Significado | Ejemplos que pueden cambiar |
|---|---|---|
atime |
Es la hora en que se accedió por última vez a los datos del archivo. | Lectura del archivo. Sin embargo, según las opciones de montaje y la política de caché, puede que no se actualice cada vez. |
mtime |
La hora en que se modificó por última vez el contenido del archivo. | Escritura de datos de archivo o cambio en la longitud del contenido. |
ctime |
La hora en que se cambió por última vez la información del estado del inode. | Cambio de permisos, propietario, número de enlaces, cambio de nombre, etc. No es la hora de creación. |
Birth |
La hora en que se creó el archivo. | Si se admite, se registra una vez al crear y no cambia con cambios de estado habituales. |
Mostrar la hora en formato legible por humanos
%x, %y, %z, %w muestran atime, mtime, ctime y Birth en un formato legible por humanos, respectivamente.
stat -c 'atime=%x
mtime=%y
ctime=%z
birth=%w' report.txt
En los sistemas de archivos que no admiten Birth o donde no se puede obtener el valor, %w puede mostrarse con un guion.
Mostrar en segundos desde la época
Las letras mayúsculas %X, %Y, %Z, %W muestran cada hora en segundos desde la Unix Epoch.
stat -c 'atime=%X mtime=%Y ctime=%Z birth=%W' report.txt
Unix Epoch toma como referencia el 1 de enero de 1970 a las 00:00:00 UTC. Si se desconoce la creación, %W muestra 0; no lo interprete automáticamente como una creación real en 1970. La resolución y precisión disponibles dependen del sistema de archivos y del sistema operativo.
Verificar información de enlaces simbólicos
Ver los metadatos del enlace en sí
Por defecto, GNU stat no sigue enlaces simbólicos y examina el enlace en sí.
stat current.log
stat -c '%N | inode=%i | type=%F' current.log
%N puede mostrar, en el caso de un enlace, el nombre del archivo citado junto con su destino.
Ver metadatos del destino de un enlace con -L
Usando -L o --dereference, puede consultar el estado real del destino al que apunta el enlace.
stat -L current.log
stat -L -c '%n | inode=%i | type=%F | size=%s' current.log
Los enlaces simbólicos rotos no pueden consultar el destino, por lo que se produce un error al usar -L.
Mostrar solo los campos deseados
Usando -c y --format
-c o --format imprimen los resultados en el formato especificado y agregan un salto de línea para cada archivo.
stat -c '%n %s %a %U:%G' file1 file2
stat --format='name=%n type=%F inode=%i' report.txt
Es seguro encerrar la cadena de formato entre comillas simples para evitar que el shell expanda su contenido.
Componer varias líneas con --printf
--printf interpreta las secuencias de escape con barra invertida, pero no agrega saltos de línea automáticos. Inserte \n directamente en las ubicaciones necesarias.
stat --printf='name=%n\nsize=%s\nmode=%a\n' report.txt
Al procesar varios archivos, también debe incluir la separación entre archivos en la cadena de formato.
Especificadores de formato de uso frecuente
| Especificador | Contenido de la salida |
|---|---|
%n |
Es el nombre del archivo. |
%N |
Es un nombre de archivo citado y, si es un enlace simbólico, también puede incluir información del destino. |
%F |
Tipo de archivo, como archivo normal, directorio o enlace simbólico. |
%s |
Es el tamaño total (en bytes). |
%b |
Es el número de bloques asignados. |
%B |
Es el tamaño en bytes de un bloque representado por %b. |
%a |
Son los permisos en octal. |
%A |
Son los permisos simbólicos, incluyendo el tipo de archivo. |
%u, %g |
Es el UID y GID numéricos del propietario. |
%U, %G |
Son el nombre de usuario y el nombre del grupo del propietario. |
%i |
Es el número de inode. |
%h |
Número de enlaces duros. |
%m |
Punto de montaje al que pertenece el archivo. |
%x, %X |
Hora del último acceso en formato legible para humanos o en segundos desde Epoch. |
%y, %Y |
Hora de la última modificación del contenido en formato legible para humanos o en segundos desde Epoch. |
%z, %Z |
Hora del último cambio de estado en formato legible para humanos o en segundos desde Epoch. |
%w, %W |
Hora de creación en formato legible para humanos o en segundos desde Epoch; si se desconoce, un guion o 0. |
%C |
Muestra el contexto de seguridad SELinux en entornos compatibles. |
Verificar la información del sistema de archivos
Ver el estado del sistema de archivos con -f
Usando -f o --file-system se muestra información del sistema de archivos donde se encuentra la ruta, no del archivo en sí.
stat -f /
stat --file-system /home
Se pueden verificar el tipo de sistema de archivos, bloques totales, bloques disponibles, número de inodos y la longitud máxima de nombre de archivo, entre otros.
Usar el especificador de formato del sistema de archivos
En el modo -f, el especificador tiene un significado diferente al de archivos. Por ejemplo, %T indica el tipo de sistema de archivos legible por humanos, %b los bloques de datos totales y %a los bloques disponibles para usuarios normales.
stat -f -c 'type=%T total=%b available=%a block-size=%S' /
Para comparar el uso del disco legible por humanos, df -h puede ser más conveniente, y para extraer solo los campos del sistema de archivos necesarios para automatización, stat -f -c es útil.
Sistemas de archivos remotos y políticas de caché
En las versiones compatibles de GNU Coreutils, se puede especificar la forma de usar la caché al consultar propiedades de sistemas de archivos remotos con --cached=MODE.
| Modo | Funcionamiento |
|---|---|
default |
Deja que el uso de la caché dependa de la política predeterminada del sistema de archivos. |
always |
Usa los atributos en caché si es posible. Puede ser más rápido, pero podría no estar actualizado. |
never |
Intenta sincronizar con los atributos más recientes si es posible. La latencia de acceso remoto puede aumentar. |
stat --cached=never /mnt/remote/report.txt
El nivel de garantía real depende de sistemas de archivos remotos como NFS y la configuración de montaje. Compruebe con stat --help si la versión instalada admite esta opción.
Ejemplo de uso con scripts de shell
Rama según el tamaño del archivo
path='archive.tar'
size=$(stat -c '%s' -- "$path") || exit 1
if [ "$size" -gt 104857600 ]; then
printf '%s\n' 'El archivo supera 100 MiB.'
fi
En entornos donde los archivos pueden cambiar entre la verificación y el uso, no presuponga que los metadatos verificados una vez se mantendrán hasta operaciones posteriores.
Comparar la hora de modificación numéricamente
left_mtime=$(stat -c '%Y' -- file-a) || exit 1
right_mtime=$(stat -c '%Y' -- file-b) || exit 1
if [ "$left_mtime" -gt "$right_mtime" ]; then
printf '%s\n' 'file-a se modificó más recientemente.'
fi
Prepare dos archivos de prueba llamados file-a y file-b antes de ejecutar la comparación. El ejemplo termina con error si no puede obtener alguna marca de tiempo. Una fecha más reciente no demuestra que el contenido sea distinto o correcto: para copias y despliegues considere también sumas de verificación, versiones y cambios simultáneos.
Comando stat de uso frecuente
| Comando | Propósito |
|---|---|
stat ARCHIVO |
Muestra todos los metadatos del archivo. |
stat -L ENLACE |
Muestra la información del objetivo al que apunta un enlace simbólico. |
stat -c '%s' ARCHIVO |
Imprime el tamaño del archivo en bytes. |
stat -c '%a %n' ARCHIVO |
Imprime los permisos en octal y el nombre del archivo. |
stat -c '%U:%G' ARCHIVO |
Imprime el usuario propietario y el grupo. |
stat -c '%i %h %n' ARCHIVO |
Imprime el inode, el número de enlaces duros y el nombre del archivo. |
stat -c '%y' ARCHIVO |
Muestra la hora de la última modificación del contenido. |
stat -c '%Y' ARCHIVO |
Muestra la hora de la última modificación del contenido en segundos Epoch. |
stat -f RUTA |
Muestra la información del sistema de archivos de la ruta especificada. |
stat -t ARCHIVO |
Se muestra en un formato conciso de una sola línea con campos fijos. |
Precauciones al usar
ctime no es la hora de creación
ctime es el tiempo de cambio, es decir, la hora en que se cambió la información del estado del archivo. No es un acrónimo de tiempo de creación, y la hora de creación puede proporcionarse en un campo separado llamado Birth.
Birth y atime no siempre contienen el valor esperado
La hora de creación puede no estar soportada según el sistema de archivos, el kernel y el método de montaje. atime tampoco se actualiza inmediatamente cada vez que se lee el archivo debido a políticas de montaje y caché como noatime, relatime.
No se analiza directamente la oración de salida
La salida predeterminada está en un formato para humanos y puede variar según el sistema operativo, la versión de Coreutils y la configuración regional. En la automatización, use -c para seleccionar solo los campos necesarios y tenga en cuenta que el nombre del archivo puede contener espacios o saltos de línea.
FAQ
¿Cómo se verifica solo los permisos octales de un archivo?
Use stat -c '%a' ARCHIVO. Si también necesita el nombre del archivo, use stat -c '%a %n' ARCHIVO.
¿Cuál es la diferencia entre mtime y ctime?
mtime es la hora en que se modificó por última vez el contenido del archivo, y ctime es la hora en que se modificó por última vez el estado del inode, como permisos, propiedad o número de enlaces. ctime no es la hora de creación del archivo.
¿Por qué Birth se muestra con un guion?
Es porque el sistema de archivos o el sistema operativo que está usando no proporciona la hora de creación o stat no pudo obtener ese valor. En este caso, %w muestra un guion y %W muestra 0.
¿El tamaño del directorio es el tamaño total de todos los archivos internos?
No. Es el tamaño de almacenamiento de los metadatos del propio directorio. Para comprobar el espacio total que utilizan los archivos debajo del directorio, use du -sh DIRECTORIO.
Para comparar otras herramientas, consulte Lista de comandos de uso frecuente en Linux. Las reglas de formato y fechas se documentan en Documentación oficial de GNU Coreutils stat, Descripción de las marcas de tiempo de archivos en GNU Coreutils y Manual oficial de GNU Coreutils.




