Linux / Comando stat: consultar tamanho, permissões e datas

stat consulta os metadados de arquivos e diretórios, como tamanho, permissões, proprietário, blocos alocados e datas. No GNU Coreutils, use stat arquivo para uma visão detalhada e stat -c '%s' arquivo para obter somente o tamanho em bytes. O comando consulta informações do sistema de arquivos, sem analisar o conteúdo como um leitor de formatos.

Os exemplos usam GNU Coreutils e sintaxe do Bash. Implementações do BSD ou macOS podem ter opções diferentes; confira stat --version e a resolução com type -a stat. Os nomes report.txt, disk.img, file1, file2 e outros representam arquivos de teste existentes; ajuste os caminhos à sua instalação. Inode é a estrutura identificadora dos metadados de um objeto dentro de um sistema de arquivos, como detalha a documentação de inode no Linux.

O que é o comando stat?

stat recupera as informações de status gerenciadas pelo sistema de arquivos, ou seja, metadados, e não o conteúdo do arquivo. Você apenas precisa especificar o arquivo ou diretório que deseja verificar como argumento.

stat report.txt
stat /etc
stat /usr/bin/bash

O comando file examina padrões do conteúdo para estimar formatos. stat responde a outra pergunta: quais são o tamanho, o tipo, as permissões, os identificadores e as datas que o sistema de arquivos informa para esse caminho?

Sintaxe e uso básico

stat [opções] arquivo ...

A sinopse usa colchetes para partes opcionais e reticências para repetição; não os digite literalmente. As linhas abaixo são consultas alternativas, com dois arquivos, dois diretórios e um nome com espaços. Cada caminho precisa existir e ser acessível ao usuário que faz a consulta.

stat file1.txt file2.txt
stat src tests
stat "annual report.pdf"

Para nomes de arquivos que começam com um hífen, especifique-os após -- para que não sejam interpretados como opções.

stat -- -sample.txt

As duas primeiras linhas mostram a versão e a ajuda. A terceira exige o leitor info e a documentação do Coreutils instalados; se não estiverem disponíveis, consulte a ajuda ou o manual oficial indicado ao final. O guia de Info explica como navegar pelos manuais de programas externos.

stat --version
stat --help
info '(coreutils) stat invocation'

Ler a saída padrão

O bloco abaixo é uma ilustração de saída Linux, com valores fictícios para explicar os campos; não é um resultado de medição deste arquivo. A apresentação muda com a versão, a localidade, o sistema operacional e o sistema de arquivos. IO Block é uma indicação para entrada/saída eficiente, não a unidade que deve ser multiplicada por Blocks.

  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 item tem o seguinte significado.

Item Significado
File O nome do arquivo ou diretório sendo consultado.
Size O tamanho lógico do arquivo, normalmente exibido em bytes.
Blocks O número de blocos alocados para o arquivo. Arquivos esparsos ou sistemas de arquivos compactados podem mostrar uma grande diferença entre o tamanho lógico e a alocação real.
IO Block Informações sobre o tamanho de bloco recomendado para entrada/saída eficiente.
Device O número que identifica o dispositivo ao qual o arquivo pertence.
Inode Este é o número do inode que identifica os metadados do arquivo dentro do sistema de arquivos.
Links O número de links físicos apontando para o mesmo inode.
Access Exibe permissões e tipo de arquivo em forma octal e simbólica.
Uid, Gid O ID numérico e o nome do usuário e grupo proprietário.
Access, Modify, Change, Birth Carimbos de data e hora sobre acesso, modificação de conteúdo, alteração de status e criação.

Diferença entre ls -l e stat

Itens de comparação ls -l stat
Propósito principal Comparar rapidamente múltiplos arquivos em forma de lista. Verificar metadados detalhados do arquivo especificado.
Data exibida por padrão Exibe principalmente o tempo de modificação de forma breve. Distingue acesso, modificação, mudança de estado e criação, quando disponível.
inode e blocos Você precisa adicionar opções para ver algumas informações. Mostra inode, número de links, blocos alocados, etc., na saída padrão.
Saída do script Analisar listas legíveis por humanos pode ser instável dependendo do ambiente. Você pode especificar diretamente os campos necessários com --format.
Informações do sistema de arquivos Não fornecido diretamente. Use -f para exibir o status do sistema de arquivos onde o arquivo está localizado.

Para comparar visualmente várias entradas, ls -l costuma ser prático; veja o guia de ls. Para selecionar um campo conhecido, prefira o formato explícito de stat, sem supor que a apresentação padrão tenha posições fixas em todas as plataformas.

Tamanho lógico e blocos alocados

Consultar o tamanho em bytes

Para um arquivo regular, Size é o tamanho lógico em bytes, incluindo regiões que possam não ter blocos físicos alocados. %s seleciona esse valor. Substitua disk.img, file1 e file2 por seus arquivos; o nome não faz com que sejam imagens de disco nem determina o conteúdo.

stat -c '%s' disk.img
stat -c '%n: %s bytes' file1 file2

Em diretórios, Size descreve o próprio diretório conforme a implementação do sistema de arquivos, normalmente associado às suas entradas. Não é a soma recursiva do conteúdo nem o tamanho de toda a estrutura inode. Para uso de armazenamento abaixo de uma pasta, consulte o guia de du.

Interpretar a alocação

%b informa a contagem de blocos alocados, e %B informa quantos bytes representa cada bloco dessa contagem. São campos relacionados entre si; não substitua %B pelo IO Block da saída padrão.

stat -c 'size=%s blocks=%b block-size=%B' disk.img

A contagem aproximada de bytes alocados pode ser calculada com %b × %B. Arquivos esparsos podem ter um espaço físico alocado muito menor do que o tamanho lógico, e com recursos como compressão de sistema de arquivos ou blocos compartilhados, é difícil determinar o uso físico de armazenamento apenas com este valor.

Permissões e proprietário

Modos em octal e em símbolos

%a mostra os bits de modo em octal e %A mostra o tipo e as permissões simbólicas. Isso não descreve sozinho toda decisão de acesso: listas de controle de acesso (ACL), políticas de segurança e permissões dos diretórios do caminho também podem importar. A consulta não altera as permissões.

stat -c '%a %A %n' script.sh

Um script que tenha modo 755 no sistema consultado pode produzir a linha ilustrativa abaixo. O comando não define esse modo nem torna o arquivo executável.

755 -rwxr-xr-x script.sh

Identificar usuário e grupo

%U e %G mostram nomes de usuário e grupo; %u e %g mostram seus identificadores numéricos, UID (User ID) e GID (Group ID). A resolução dos nomes depende das contas e serviços de identificação disponíveis no sistema.

stat -c 'owner=%U(%u) group=%G(%g)' report.txt

Em ambientes onde o nome correspondente a um ID numérico não pode ser encontrado, o campo de nome pode ser exibido de forma diferente.

Inode e links físicos

Consultar o inode

%i exibe o número do inode que identifica o arquivo dentro do sistema de arquivos.

stat -c '%i %n' report.txt

O número do inode é único dentro do sistema de arquivos, não globalmente. Compare também o dispositivo, por exemplo com stat -c '%d:%i' -- "caminho". Isso descreve os objetos observados naquele instante; depois de uma remoção, um número de inode pode ser reutilizado, e o par não é uma identidade histórica permanente.

Criar e comparar dois links físicos

%h mostra quantos links físicos apontam para o arquivo. O exercício completo abaixo cria uma pasta temporária exclusiva, um arquivo e um segundo nome por meio de ln. Exige Bash, mktemp, ln e um sistema de arquivos que suporte links físicos. Se a criação falhar, o subshell encerra sem consultar um link inexistente.

(
  demo_dir=$(mktemp -d "${TMPDIR:-/tmp}/stat-links.XXXXXX") || exit 1
  cd -- "$demo_dir" || exit 1
  printf '%s\n' 'Exemplo de link físico.' > original.txt || exit 1
  ln -- original.txt copy-link.txt || exit 1
  printf 'Pasta de teste: %s\n' "$demo_dir"
  stat -c 'device=%d inode=%i links=%h name=%n' -- original.txt copy-link.txt
)

As duas entradas criadas devem mostrar o mesmo dispositivo e inode, com contagem de links igual a 2. Os arquivos permanecem na pasta temporária indicada; os parênteses preservam o diretório do chamador. Criar o link não duplica os dados: os dois nomes se referem ao mesmo arquivo. Um link simbólico é outro objeto e exige distinguir a consulta do link da consulta de seu destino.

Diferenças entre atime, mtime, ctime e Birth

Os quatro campos registram eventos diferentes. No Linux, atime significa último acesso, mtime é a última modificação dos dados e ctime é a última mudança de estado do inode. Birth, quando disponível, é a criação do arquivo. Outros sistemas podem emular esses campos de formas distintas; ctime no Linux não é abreviação de creation time.

Campo Significado O que pode atualizar o campo
atime O último horário de acesso aos dados do arquivo. Leitura de arquivo. No entanto, dependendo das opções de montagem e das políticas de cache, pode não ser atualizado a cada vez.
mtime O último horário em que o conteúdo do arquivo foi modificado. Gravação de dados do arquivo ou alteração do tamanho do conteúdo.
ctime O último horário em que as informações de status do inode foram alteradas. Gravação de conteúdo ou mudanças de modo, proprietário e links, entre outras alterações. Não é a criação.
Birth O tempo em que o arquivo foi criado. Registrado apenas uma vez na criação, se suportado, e não muda com alterações de status normais.

Mostrar datas legíveis

%x, %y, %z e %w selecionam, respectivamente, atime, mtime, ctime e Birth. As quebras de linha reais dentro das aspas do formato abaixo formam uma única chamada no Bash. A apresentação segue o fuso definido por TZ ou o padrão do sistema, além da localidade.

stat -c 'atime=%x
mtime=%y
ctime=%z
birth=%w' report.txt

Em sistemas de arquivos que não suportam Birth ou não podem obter seu valor, %w pode ser exibido como um hífen.

Mostrar segundos desde a Epoch

%X, %Y, %Z e %W mostram segundos desde a Unix Epoch, 1º de janeiro de 1970 às 00:00:00 UTC. Na forma sem precisão, os valores são inteiros, adequados a comparações de segundos. Eles não mostram todas as frações que podem aparecer no formato legível.

stat -c 'atime=%X mtime=%Y ctime=%Z birth=%W' report.txt

Quando Birth é desconhecido, %W mostra 0 e %w mostra -. Formatos como %.9Y podem pedir a fração de segundo onde houver suporte, mas não criam precisão ausente no sistema de arquivos. Não passe esse número decimal ao teste inteiro -gt usado nos exemplos seguintes.

Metadados de links simbólicos

Consultar o próprio link

Sem -L, GNU stat consulta o link simbólico fornecido como argumento. O exemplo pressupõe que current.log seja um link existente; substitua o nome pelo seu caminho de teste.

stat current.log
stat -c '%N | inode=%i | type=%F' current.log

%N pode incluir o nome entre aspas e o destino indicado pelo link, sem seguir esse destino. A variável QUOTING_STYLE controla a forma das aspas. Não use essa apresentação como um formato independente das regras de citação do shell.

Seguir o destino com -L

Usar -L ou --dereference verifica o status do alvo real para o qual o link aponta.

stat -L current.log
stat -L -c '%n | inode=%i | type=%F | size=%s' current.log

Links simbólicos quebrados não podem verificar o alvo, então usar -L causará um erro.

Selecionar campos de saída

Usar -c e --format

-c ou --format exibem os resultados no formato especificado e adicionam uma quebra de linha para cada arquivo.

stat -c '%n %s %a %U:%G' file1 file2
stat --format='name=%n type=%F inode=%i' report.txt

É seguro colocar a string de formato entre aspas simples para que o shell não a interprete.

Controlar quebras com --printf

--printf interpreta escape de barra invertida, mas não adiciona quebras de linha automáticas. Insira \n diretamente onde necessário.

stat --printf='name=%n\nsize=%s\nmode=%a\n' report.txt

Inclua os separadores de cada registro no formato. Para pares de nome e tamanho delimitados por byte nulo (NUL), GNU stat --printf='%n\0%s\0' -- "caminho" evita confundir espaços ou quebras de linha do nome com o separador. A saída exige um consumidor compatível com NUL; %n não recebe automaticamente a citação de %N.

Especificadores comuns

Especificador Conteúdo de saída
%n O nome do arquivo.
%N O nome do arquivo entre aspas e, se for um link simbólico, também pode incluir informações sobre o destino.
%F O tipo de arquivo, como arquivo regular, diretório ou link simbólico.
%s Este é o tamanho total (em bytes).
%b Este é o número de blocos alocados.
%B Este é o tamanho em bytes de um bloco representado por %b.
%a Permissões octais.
%A Permissões simbólicas incluindo o tipo de arquivo.
%u, %g O UID e GID numéricos do proprietário.
%U, %G O nome de usuário do proprietário e o nome do grupo.
%i O número do inode.
%h Número de links físicos.
%m O ponto de montagem ao qual o arquivo pertence.
%x, %X Exibe a última vez de acesso em um formato legível ou como segundos desde a Epoch.
%y, %Y Exibir o último horário de modificação do conteúdo em um formato legível para humanos ou como segundos Epoch.
%z, %Z Exibir o último horário de alteração de status em um formato legível para humanos ou como segundos Epoch.
%w, %W Exibir o horário de criação em um formato legível para humanos ou como segundos Epoch; se desconhecido, mostrar um hífen ou 0.
%C Exibir o contexto de segurança SELinux em ambientes suportados.

Consultar o sistema de arquivos

Usar -f

-f ou --file-system consulta o sistema de arquivos que contém o caminho, em vez dos metadados individuais do arquivo. Essa opção implica seguir links simbólicos, como -L. Substitua /home se não houver essa pasta no sistema.

stat -f /
stat --file-system /home

Você pode verificar o tipo de sistema de arquivos, blocos totais, blocos disponíveis, número de inodes e comprimento máximo do nome do arquivo.

Interpretar campos do sistema de arquivos

No modo -f, os especificadores mudam de significado: %T é o tipo do sistema de arquivos, %b é a contagem total de blocos de dados e %a é a contagem disponível para usuários comuns. %S é o tamanho fundamental em bytes usado nessas contagens; não o confunda com o %s deste modo, que indica o tamanho de bloco para transferências.

stat -f -c 'type=%T total=%b available=%a block-size=%S' /

Para comparar o uso de disco legível por humanos, df -h pode ser mais conveniente, e para extrair apenas os campos do sistema de arquivos necessários para automação, stat -f -c é útil.

Cache e sistemas de arquivos remotos

Onde houver suporte do sistema, --cached=MODE controla como os atributos são obtidos, equilibrando atualização e custo de acesso. É especialmente útil em sistemas de arquivos remotos. Uma versão aceitar a opção não prova que toda plataforma ofereça a mesma garantia de atualização.

Modos Ação
default Se deve usar o cache é deixado para a política padrão do sistema de arquivos.
always Usar atributos em cache, se possível. Pode ser rápido, mas pode não estar atualizado.
never Tentar sincronizar com os atributos mais recentes, se possível. A latência do acesso remoto pode aumentar.
stat --cached=never /mnt/remote/report.txt

A linha anterior exige que /mnt/remote/report.txt seja um arquivo acessível no sistema remoto já configurado. never pode aumentar a espera de rede e acionar montagens automáticas. O resultado continua sujeito ao suporte do sistema, às regras de montagem e a mudanças concorrentes; não é uma transação nem bloqueia o arquivo.

Exemplos completos em Bash

Comparar o tamanho com 100 MiB

Salve o próximo bloco como check-size.sh e execute bash check-size.sh "arquivo regular", trocando o campo pelo caminho existente. Sem argumento, ele consulta archive.tar na pasta atual. -L pede os dados do destino caso o caminho seja um link. O limite é 100 MiB = 104.857.600 bytes; exatamente esse valor pertence ao ramo menor ou igual. O script só consulta e informa, sem modificar o arquivo.

path=${1:-archive.tar}
size=$(stat -L -c '%s' -- "$path") || {
  printf '%s\n' 'Não foi possível consultar o tamanho.' >&2
  exit 1
}

if [ "$size" -gt 104857600 ]; then
  printf '%s\n' 'O arquivo é maior que 100 MiB.'
else
  printf '%s\n' 'O arquivo tem no máximo 100 MiB.'
fi

Execute o script com Bash, sem carregá-lo com source, pois o tratamento de erro usa exit. Uma falha da consulta termina com 1; os dois resultados de comparação terminam normalmente com 0. Os valores podem mudar entre a consulta e o uso: essa verificação não bloqueia o arquivo nem valida o conteúdo.

Comparar mtime em segundos

Salve o bloco abaixo como compare-mtime.sh e execute bash compare-mtime.sh "primeiro arquivo" "segundo arquivo", usando dois caminhos existentes. Sem argumentos, os nomes são file-a e file-b. As duas consultas precisam ter sucesso antes da comparação; um valor ausente não segue para o teste inteiro.

left=${1:-file-a}
right=${2:-file-b}
left_mtime=$(stat -L -c '%Y' -- "$left") || {
  printf '%s\n' 'Não foi possível consultar o primeiro arquivo.' >&2
  exit 1
}
right_mtime=$(stat -L -c '%Y' -- "$right") || {
  printf '%s\n' 'Não foi possível consultar o segundo arquivo.' >&2
  exit 1
}

if [ "$left_mtime" -gt "$right_mtime" ]; then
  printf 'Mais recente em segundos: %s\n' "$left"
elif [ "$left_mtime" -lt "$right_mtime" ]; then
  printf 'Mais recente em segundos: %s\n' "$right"
else
  printf '%s\n' 'Os dois valores de mtime são iguais em segundos.'
fi

O script termina com 1 se uma consulta falhar e com 0 após comparar os valores. Tempos iguais em segundos podem esconder frações diferentes e não significam conteúdo idêntico. -L segue links neste exemplo. Execute o script separadamente com Bash; diferenças de relógio, datas restauradas e mudanças simultâneas também limitam seu uso para decidir backups ou implantações. Compare checksums ou versões quando a identidade dos dados importar.

Combinações úteis

Comando Propósito
stat arquivo Exibe todos os metadados do arquivo.
stat -L link Exibe informações sobre o destino que o link simbólico aponta.
stat -c '%s' arquivo Exibe o tamanho do arquivo em bytes.
stat -c '%a %n' arquivo Exibe as permissões em octal e o nome do arquivo.
stat -c '%U:%G' arquivo Exibe o usuário proprietário e o grupo.
stat -c '%i %h %n' arquivo Exibe o inode, número de links físicos e o nome do arquivo.
stat -c '%y' arquivo Exibe a última hora de modificação do conteúdo.
stat -c '%Y' arquivo Imprime a última hora de modificação como segundos desde a Epoch.
stat -f caminho Exibe informações sobre o sistema de arquivos que contém o caminho fornecido.
stat -t arquivo Apresenta uma forma resumida; o modo e os nomes ainda precisam ser considerados na leitura.

Cuidados ao interpretar os resultados

Distinguir ctime de criação

ctime é o tempo de alteração, ou seja, o momento em que as informações de status do arquivo foram modificadas. Não é uma abreviação de tempo de criação, e o tempo de criação pode ser fornecido em um campo separado Birth.

Considerar suporte a Birth e políticas de atime

O tempo de criação pode não ser suportado dependendo do sistema de arquivos, kernel e método de montagem. atime também pode não ser atualizado imediatamente toda vez que um arquivo é lido devido a políticas de montagem como noatime ou relatime e cache.

Definir um formato para automação

A saída padrão e -t são apresentações cujos detalhes variam com modo, contexto de segurança, versão e localidade. Em automação, escolha os campos com -c ou --printf e um separador adequado aos nomes possíveis; não suponha que dividir por espaços seja suficiente. Consulte o retorno da chamada antes de usar qualquer valor.

Perguntas frequentes

Como posso verificar apenas as permissões octais de um arquivo?

Use stat -c '%a' -- "arquivo", substituindo o campo pelo caminho real. Para incluir o nome, use stat -c '%a %n' -- "arquivo". O comando informa os bits de modo, sem alterar as permissões.

Qual é a diferença entre mtime e ctime?

mtime é o momento em que o conteúdo do arquivo foi modificado pela última vez, e ctime é o momento em que o status do inode, por gravação de dados ou mudanças de permissões, propriedade e contagem de links, foi alterado pela última vez. ctime não é o horário de criação do arquivo.

Por que Birth aparece como um hífen?

É porque o sistema de arquivos ou sistema operacional em uso não fornece a hora de criação, ou stat não pôde obter esse valor. Neste caso, %w exibe um hífen, e %W exibe 0.

O tamanho de um diretório é o tamanho total de todos os arquivos dentro dele?

Não. Size descreve o próprio diretório conforme o sistema de arquivos; não soma os arquivos abaixo dele. du -sh -- "diretório", com o caminho real, consulta o uso de armazenamento da árvore segundo as regras de du.

Documentação oficial