Primeiros Passos com stat - Lendo Metadados de Arquivos

Primeiros Passos com stat - Lendo Metadados de Arquivos

O Que o stat Mostra

stat recupera metadados detalhados de um arquivo em um único comando — mais do que ls -l fornece. Ele mostra timestamps, números de inode, contagem de hard links, uso de blocos e cada atributo que o sistema de arquivos registra.

Resumo Rápido

  • Verificar timestamps de arquivo -> stat nomedoarquivo
  • Extrair um campo único em scripts -> stat -c "%Y" nomedoarquivo (mtime como timestamp Unix)
  • Verificar uso de blocos/inodes do sistema de arquivos -> stat -f /caminho

Uso Básico

$ stat /etc/hosts
  File: /etc/hosts
  Size: 220             Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 1179676     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2026-05-28 09:12:34.000000000 +0000
Modify: 2026-03-10 14:22:05.000000000 +0000
Change: 2026-03-10 14:22:05.000000000 +0000
 Birth: 2025-01-15 08:00:00.000000000 +0000

A saída inclui o nome do arquivo, tamanho, número de inode, permissões, dono/grupo e três tipos de timestamps.

Lendo os Campos da Saída

Campo Significado
Size Tamanho do arquivo em bytes
Blocks Espaço em disco usado em blocos de 512 bytes
IO Block Tamanho do bloco do sistema de arquivos
Inode Número do inode (identificador único no sistema de arquivos)
Links Contagem de hard links
Access (0644/...) Permissões em notação octal e simbólica
Uid / Gid Usuário e grupo proprietários

Blocks conta blocos de disco de 512 bytes realmente alocados, não apenas o tamanho lógico do arquivo. Pode ser maior que Size devido ao alinhamento de limites de bloco.

Entendendo os Três Timestamps

A saída do stat mostra três timestamps: Access, Modify e Change. Eles são relacionados, mas distintos.

Timestamp Nome curto Atualizado quando
Access atime O arquivo é lido
Modify mtime O conteúdo do arquivo muda
Change ctime Os atributos do inode mudam (inclusive após atualizações do mtime)
Birth btime O arquivo é criado (dependente do sistema de arquivos)

ctime não é hora de criação

Change significa "alteração", não "criação". Executar chmod ou chown também atualiza o ctime. Para a verdadeira hora de criação, use Birth — mas alguns sistemas de arquivos (não-ext4) exibem -- para Birth.

Nota de Desempenho sobre atime

Em muitos sistemas Linux, ler um arquivo dispara uma escrita de atime. Sistemas sensivos a desempenho frequentemente desabilitam isso com a opção de montagem noatime.

$ grep noatime /etc/fstab

Usando Números de Inode

O número de inode identifica unicamente um arquivo dentro de um sistema de arquivos. Hard links compartilham o mesmo inode.

$ stat /etc/hosts | grep Inode
    Inode: 1179676
# Criar um hard link e verificar que compartilham o mesmo inode
$ ln file.txt hardlink.txt
$ stat -c "%i %n" file.txt hardlink.txt
1234567 file.txt
1234567 hardlink.txt

A contagem de Links se torna 2, confirmando que dois nomes (entradas de diretório) apontam para o mesmo inode.

Opções de Formato para Scripts

Use -c (ou --format) para extrair campos específicos em scripts.

# Tamanho do arquivo em bytes
$ stat -c "%s" /var/log/syslog
1048576

# Hora da ultima modificacao (timestamp Unix)
$ stat -c "%Y" /var/log/syslog
1748700000

# Permissoes (octal) e dono
$ stat -c "%a %U" /etc/hosts
644 root

# Multiplos campos formatados
$ stat -c "Name: %n | Size: %s bytes | Modified: %y" /etc/hosts
Name: /etc/hosts | Size: 220 bytes | Modified: 2026-03-10 14:22:05.000000000 +0000

Especificadores de formato comuns:

Especificador Significado
%n Nome do arquivo
%s Tamanho em bytes
%a Permissões (octal)
%A Permissões (simbólica, ex: -rw-r--r--)
%U Nome do usuário proprietário
%G Nome do grupo proprietário
%i Número do inode
%y Hora da última modificação (legível por humanos)
%Y Hora da última modificação (timestamp Unix)
%x Hora do último acesso
%z Hora da última alteração de status
%h Contagem de hard links

%y vs %Y: minúsculo %y fornece um timestamp legível por humanos; maiúsculo %Y fornece segundos epoch. Use %Y em scripts para aritmética e comparação.

Informações do Sistema de Arquivos com -f

A flag -f reporta estatísticas em nível de sistema de arquivos em vez de metadados de arquivos individuais.

$ stat -f /
  File: "/"
    ID: fd0000000000 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 20000000  Free: 12000000  Available: 11000000
Inodes: Total: 5000000   Free: 4800000
Campo Significado
Block size Tamanho do bloco do sistema de arquivos
Blocks: Total/Free/Available Total, livre e blocos disponíveis para não-root
Inodes: Total/Free Total e contagem restante de inodes

Quando um sistema de arquivos tem espaço mas operações de escrita falham, verifique a exaustão de inodes: Inodes: Free próximo de zero. Você também pode verificar com df -i. Exaustão de inodes é uma causa comum de "no space left on device" apesar de espaço aparentemente livre.

Casos de Uso Práticos

Verificar quando um arquivo foi modificado pela última vez

$ stat -c "%y" /etc/nginx/nginx.conf
2026-04-01 10:30:00.000000000 +0000

Registrar mtime antes de um backup

$ stat -c "%Y %n" /important/data.db
1748700000 /important/data.db

Comparar tempos de modificação entre arquivos

$ for f in /etc/nginx/*.conf; do stat -c "%Y %n" "$f"; done | sort -n
1748600000 /etc/nginx/mime.types
1748700000 /etc/nginx/nginx.conf

Obter permissões em formato numérico (para chmod)

$ stat -c "%a" /etc/hosts
644

Próximas Leituras