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.




