Tutorial de Linux / Tipos de arquivo e metadados: ls, file, stat e readlink

O nome ou a extensão de um arquivo não bastam para determinar seu tipo no Linux. ls -l mostra o tipo da entrada, como arquivo comum, diretório ou link, e seus atributos básicos; file examina características para inferir um formato, enquanto stat consulta metadados, como tamanho, permissões, horários e inode. Esta aula explica como interpretar essas informações e usar readlink para consultar o destino registrado em um link simbólico.

Depois de reconhecer os tipos e os metadados, você pode comparar nomes, inodes e destinos na prática em inglês sobre hard links e links simbólicos.

O que significa o tipo de arquivo no Linux?

As entradas de um sistema de arquivos incluem arquivos comuns, diretórios, links simbólicos e dispositivos. O primeiro caractere de uma linha de arquivo em ls -l identifica o tipo dessa entrada. Uma extensão, como .txt ou .jpg, faz parte do nome e não substitui esse indicador. Aqui, “tipo de arquivo” não significa o formato do sistema de arquivos, como ext4.

Primeiro caractere Tipo Exemplo
- Arquivo comum Documento ou arquivo executável.
d Diretório Local que contém outras entradas.
l Link simbólico Entrada que aponta para outro caminho.
c, b Dispositivo de caracteres ou de blocos Entradas de dispositivos sob /dev.
p, s FIFO, ou pipe nomeado, e socket Entradas usadas na comunicação entre processos.

FIFO significa “primeiro a entrar, primeiro a sair”; um pipe nomeado oferece um caminho para comunicação entre processos. Um socket é outro tipo de ponto de comunicação. Para inspecionar a entrada indicada, use ls -ld. Aplicar somente ls -l a um diretório pode listar seu conteúdo em vez dos detalhes do próprio diretório:

ls -ld /etc /etc/passwd

A linha de /etc normalmente começa com d, e a de /etc/passwd, com -. As demais colunas mostram permissões, número de links, proprietário, grupo, tamanho, data de modificação e nome. Os valores e sua apresentação variam. Se o arquivo de exemplo não existir no ambiente, use outro arquivo comum que você possa ler e substitua seu caminho nos comandos correspondentes. Uma mensagem de erro não deve ser interpretada como uma classificação.

Usar file para inferir o formato do conteúdo

file aplica testes de informações do sistema de arquivos, padrões reconhecidos e características do conteúdo para produzir uma descrição. Assim, /etc/passwd pode ser identificado como texto mesmo sem extensão:

file /etc/passwd

A saída pode ser parecida com esta. A redação depende da implementação, das regras de detecção e da codificação do arquivo:

/etc/passwd: ASCII text

O resultado é uma classificação por inspeção, e não uma certificação infalível do conteúdo ou da segurança do arquivo. Uma extensão .png, por exemplo, não transforma um texto em imagem. Se a resposta disser que o arquivo não pôde ser aberto, confira sua existência e as permissões antes de tirar conclusões sobre o formato.

Ao investigar um link simbólico, escolha explicitamente o que examinar: file -h link consulta o link, enquanto file -L link segue seu destino, em sistemas que oferecem esse suporte. Substitua link pelo caminho real. O comportamento padrão também pode depender do ambiente.

Consultar os metadados com stat

stat mostra informações mantidas pelo sistema de arquivos, sem apresentar o texto do documento. Entre elas estão tamanho, permissões, proprietário, número de inode, número de links e horários. Um inode é uma estrutura usada pelo sistema de arquivos para administrar metadados de um objeto; ele é diferente do nome pelo qual você acessa esse objeto.

stat /etc/passwd

Para reduzir a saída, o GNU stat aceita -c com uma cadeia de formatação. No exemplo, %F indica o tipo de arquivo, %s o tamanho em bytes e %n o nome:

stat -c '%F | %s bytes | %n' /etc/passwd

O resultado segue este formato de uma linha. O tamanho 1234 é fictício e serve apenas para ilustrar a posição do campo; não é uma medição do arquivo em seu computador. O tamanho real e o idioma da descrição podem ser diferentes:

regular file | 1234 bytes | /etc/passwd

O primeiro campo informa que o alvo é um arquivo comum, o campo central mostra seu tamanho em bytes e o último identifica o caminho consultado. No resultado completo de stat, Access indica o último acesso registrado, Modify a modificação dos dados, Change a alteração do estado e Birth a criação, quando disponível.

Não leia Change como “criação”: esse horário pode mudar por uma gravação ou por alterações de metadados, como permissões e proprietário. Birth pode não ser fornecido pelo sistema de arquivos ou pela ferramenta. A atualização de Access também depende das regras de montagem; ler um arquivo não garante uma mudança imediata desse campo.

Distinguir um link simbólico de seu destino

Um link simbólico é uma entrada separada que armazena um caminho. ls -l costuma mostrá-lo como link -> destino. Sem opções de resolução, readlink link imprime o texto do caminho guardado no link. Se o caminho for relativo, interprete-o a partir do diretório que contém o link, e não do diretório atual de seu shell.

Os metadados do link diferem dos metadados do arquivo apontado. Por padrão, o GNU stat examina o próprio link; com stat -L link, segue o destino. Se o link estiver quebrado, a consulta ao destino pode falhar, mesmo que a entrada do link continue existindo. A prática sobre links citada no início mostra como criar os exemplos para essa comparação.

Qual comando escolher?

  • Tipo e atributos básicos na listagem: ls -l, ou ls -ld para a entrada indicada em si.
  • Formato provável a partir das características do conteúdo: file.
  • Tamanho, horários, inode e outros atributos detalhados: stat.
  • Caminho armazenado em um link simbólico: readlink.

Os guias de file e os formatos reconhecidos, stat e os campos de metadados e readlink e os destinos de links simbólicos apresentam opções e exemplos específicos dessas consultas.

Documentação oficial

Consulte o manual file(1), a documentação do GNU stat e a documentação do GNU readlink para verificar opções e exceções. O manual inode(7) detalha os atributos e as regras dos horários no Linux.