Linux / Comando file: identificar formatos e tipos MIME
file estima o tipo de um arquivo pelas informações do sistema de arquivos, pelas assinaturas de bytes e pelas características do texto. A classificação usual não depende da extensão do nome: uma imagem renomeada para .bin ainda pode ser reconhecida como imagem. O resultado ajuda a escolher como abrir o arquivo, mas não comprova sua integridade nem segurança.
Os exemplos usam o programa file e sua biblioteca de classificação libmagic para Unix/Linux e sintaxe do Bash. Magic é a base de regras que compara assinaturas e outros padrões do conteúdo. Use arquivos próprios ou de teste: os nomes abaixo representam entradas que devem existir na pasta atual, e os caminhos de sistema devem ser adaptados à sua instalação.
O que é o comando file?
file inspeciona cada caminho fornecido como argumento e gera uma descrição legível por humanos do tipo de arquivo.
file README.md
file photo.jpg
file /usr/bin/ls
A mensagem depende da plataforma, da versão do programa, da base magic e dos bytes examinados. As linhas abaixo são ilustrações de texto UTF-8, imagem JPEG e executável Linux no formato ELF (Executable and Linkable Format). Não espere que qualquer arquivo chamado photo.jpg produza essa descrição; os dados precisam corresponder ao formato.
README.md: Unicode text, UTF-8 text
photo.jpg: JPEG image data, JFIF standard 1.01
/usr/bin/ls: ELF 64-bit LSB pie executable, x86-64, dynamically linked
A classificação normal não reescreve o conteúdo. A leitura exige acesso ao arquivo e pode atualizar sua data de acesso, conforme o sistema de arquivos e suas opções de montagem. -p tenta preservar essa data nos sistemas compatíveis; não é uma garantia universal de ausência de alterações em metadados.
Como file identifica o formato
A implementação com libmagic faz, em geral, três grupos de testes na ordem abaixo. O primeiro grupo bem-sucedido fornece a descrição usual; opções como -k podem pedir mais correspondências. A documentação do formato das regras magic descreve como as regras relacionam posições e valores dos bytes a mensagens e tipos MIME (Multipurpose Internet Mail Extensions), identificadores do tipo de conteúdo.
- Metadados do sistema de arquivos: identificam diretórios, links simbólicos, sockets, canais nomeados (FIFOs) e arquivos vazios, quando disponíveis no sistema.
- Regras magic: comparam bytes e outros padrões em posições do arquivo com a base de assinaturas.
- Texto e linguagem: estimam a codificação e formatos como código-fonte ou texto de configuração. Linguagem aqui não significa detectar de forma confiável se o texto está em português ou em outro idioma natural.
Arquivos com informações de identificação fixa em seu formato, como PNG, JPEG, PDF e executáveis ELF, podem ser classificados mesmo sem uma extensão. Em contraste, arquivos sem padrões únicos ou com conteúdo muito curto e ambíguo podem simplesmente ser exibidos como data.
Sintaxe e uso básico
file [opções] arquivo ...
A sinopse usa colchetes para opções e reticências para argumentos repetidos; não os digite literalmente. As chamadas abaixo são alternativas. Substitua nomes como report.pdf, image.png e archive.tar.gz por entradas existentes. Diretórios e dispositivos normalmente são descritos pelos metadados, sem ler seu conteúdo como um arquivo regular.
file report.pdf
file image.png archive.tar.gz script.sh
file /etc /dev/null /usr/bin/env
Coloque entre aspas caminhos com espaços ou caracteres especiais do shell. -- encerra as opções para um nome como -sample.bin. Um argumento que seja somente - continua significando entrada padrão; para um arquivo cujo nome literal seja um hífen, use ./-.
file "annual report.pdf"
file -- -sample.bin
Confira a versão e as opções com as duas primeiras linhas. man file depende de o leitor de manuais e essa página estarem instalados; se não estiverem, use file --help e o manual do comando file mantido pelo projeto.
file --version
file --help
man file
Comparar o nome e o conteúdo
Inspecionar arquivos sem extensão
Arquivos executáveis do Linux ou scripts de comando frequentemente não possuem extensões. file pode verificar o formato inspecionando o conteúdo em vez do nome.
file /usr/bin/bash
file /usr/bin/python3
file ./run-backup
A primeira linha de um script pode conter um shebang, como #!/usr/bin/env bash, que indica o interpretador e pode aparecer na classificação. Programas compilados para Linux podem ser ELF; executáveis de outras plataformas têm formatos distintos. As linhas anteriores apenas inspecionam esses arquivos, sem executá-los.
Conferir uma extensão incorreta
Isso também é útil quando a extensão de um arquivo baixado ou recebido não corresponde ao conteúdo real.
file download.dat
file attachment.bin
Mesmo que o resultado indique uma imagem ou formato compactado, isso não renomeia automaticamente o arquivo. Determine a extensão após verificar o programa necessário e as regras de trabalho.
Interpretar mensagens comuns
| Expressões representativas | Significado |
|---|---|
directory |
É um diretório, não um arquivo normal. |
symbolic link to ... |
É um link simbólico apontando para outro caminho. |
empty |
É um arquivo regular vazio com tamanho de 0 bytes. |
ASCII text |
É principalmente texto consistindo em caracteres imprimíveis na faixa ASCII. |
Unicode text, UTF-8 |
Foi determinado que é um texto Unicode codificado em UTF-8. |
ELF ... executable |
É um arquivo executável no formato ELF usado no Linux e em outros sistemas. |
shared object |
Pode ser identificado como uma biblioteca compartilhada ou formato de executável independente de posição. |
data |
É um dado binário que não pôde ser suficientemente identificado como um formato conhecido ou texto. |
cannot open |
O arquivo não pôde ser aberto devido ao caminho não existir ou por causa de permissões, etc. |
Os resultados não garantem a confiabilidade ou segurança do arquivo. O fato de ter sido reconhecido como um formato específico e o julgamento de que não contém código malicioso são questões diferentes.
Consultar MIME e codificação
Mostrar tipo e codificação com -i
-i, equivalente a --mime, pede uma identificação do tipo e da codificação. MIME usa identificadores como text/html e image/png. Em texto, charset indica a codificação estimada; essa estimativa não converte os bytes do arquivo.
file -i index.html
file --mime README.md
Um arquivo HTML que contenha texto UTF-8 não ASCII pode produzir uma linha como esta. Se o conteúdo usar apenas caracteres ASCII, a codificação informada pode ser us-ascii, mesmo que o editor o tenha salvo como UTF-8.
index.html: text/html; charset=utf-8
Exibir somente tipo ou codificação
--mime-type seleciona apenas o tipo, e --mime-encoding seleciona a codificação estimada. Em dados não textuais, uma resposta como binary não é o nome de um conjunto de caracteres para abrir como texto.
file --mime-type image.webp
file --mime-encoding README.md
Use -b junto se você precisar apenas do valor sem o nome do arquivo.
file -b --mime-type image.webp
file -b --mime-encoding README.md
Ele pode ser referenciado em configurações de servidor web ou verificações de upload, mas você não deve julgar um arquivo como seguro apenas com base no valor MIME enviado pelo cliente ou no resultado do file.
Ajustar nomes e separadores na saída
Mostrar somente a descrição com -b
A saída usual inclui nome: descrição. -b ou --brief omite o prefixo com o nome, sem mudar o conteúdo examinado.
file -b archive.tar.gz
file -b --mime-type photo.jpg
É útil ao armazenar apenas o resultado em uma variável de script.
Remover alinhamento e trocar o separador
-N remove o preenchimento usado para alinhar nomes de comprimentos diferentes; não ordena os arquivos. -F troca o separador entre nome e descrição. As entradas file1, file2 e file-with-long-name.bin devem ser substituídas por arquivos existentes.
file -N file1 file-with-long-name.bin
file -F ' => ' file1 file2
Para saída delimitada por byte nulo (NUL), versões que oferecem -0 usam file -00 -- arquivo para separar nome e descrição por NUL. Um único -0 acrescenta NUL ao nome, mas mantém o separador e a formatação restante. A saída com NUL exige um consumidor compatível e não deve ser dividida novamente por linhas. Confira file --help antes de automatizar.
Inspecionar links simbólicos
Consultar o próprio link
Sem POSIXLY_CORRECT, o comportamento padrão é não seguir links simbólicos. -h ou --no-dereference pede explicitamente a descrição do próprio link e de seu destino indicado, sem classificar o conteúdo desse destino. current.log pressupõe um link existente.
file -h current.log
Como o comportamento padrão pode variar dependendo de a variável de ambiente POSIXLY_CORRECT estar definida ou não, é mais seguro especificar as opções necessárias em scripts.
Seguir o destino com -L
-L ou --dereference segue links simbólicos para verificar o tipo real do arquivo de destino.
file -L current.log
file --dereference latest-image
Um link quebrado não fornece um arquivo de destino para examinar; a mensagem pode descrever o link ou o erro. Como certas falhas de sistema de arquivos não alteram o status de saída padrão, use -E e confira o retorno quando um script precisar distinguir falha de leitura de classificação bem-sucedida.
Inspecionar dados compactados
Reconhecer o formato externo
Se você verificar sem opções, geralmente descreve o formato de compressão externo como gzip, xz, bzip2.
file backup.tar.gz
file archive.xz
Examinar o conteúdo com -z
-z ou --uncompress tenta examinar o conteúdo de formatos compactados compatíveis, normalmente mostrando informações do conteúdo e da compressão. Não é um comando para extrair uma árvore de arquivos em uma pasta. O suporte depende da compilação e dos descompactadores disponíveis; uma identificação externa sem detalhes internos não comprova que o conteúdo foi analisado.
file -z backup.tar.gz
file --uncompress archive.xz
Essa análise pode consumir tempo e memória adicionais. Use arquivos pequenos e conhecidos nos exercícios e preserve as restrições do ambiente. Arquivos de origem desconhecida ou que possam expandir excessivamente exigem isolamento e limites próprios; reconhecer gzip ou xz não garante que a descompactação seja segura.
Consultar vários arquivos
Usar padrões do shell
Você pode verificar arquivos com uma extensão específica no diretório atual de uma vez.
file *.jpg
file *.sh
No Bash padrão, um padrão sem correspondências pode permanecer literal e gerar um diagnóstico sobre *.jpg. Opções como nullglob e failglob mudam essa situação. Muitos nomes também podem exceder o limite da linha de comando; nesse caso, use uma enumeração como find -exec.
Ler uma lista com -f
-f ou --files-from lê um arquivo com um caminho por linha. Prepare files-to-check.txt com, por exemplo, uma linha README.md e outra image.webp, ajustadas aos arquivos reais. Caminhos relativos da lista são interpretados a partir do diretório em que o comando roda, não da pasta onde a lista foi guardada. Esse formato por linhas não representa sem ambiguidade nomes que contenham quebras de linha.
file -f files-to-check.txt
file -F ' => ' -f files-to-check.txt
-f processa a lista assim que encontra a opção, então opções que afetam a saída como -F devem ser colocadas antes dela.
Entrada padrão e consultas recursivas
Classificar dados da entrada padrão
Especificar um único hífen - como nome de arquivo lê dados da entrada padrão.
printf '%s\n' 'hello' | file -
O exemplo fornece texto ASCII pela entrada padrão, sem criar um arquivo. A saída costuma identificar texto ASCII. A análise de um fluxo pode dar menos detalhes que a de um arquivo regular, pois reposicionamento e leituras adicionais podem não estar disponíveis.
Combinar com find -exec
A pasta ./uploads deve existir e conter os arquivos de teste desejados. O exemplo usa find para selecionar arquivos regulares recursivamente; ajuste a pasta inicial para não percorrer dados desnecessários. O guia de tree ajuda a visualizar essa organização antes da inspeção.
find ./uploads -type f -exec file -- {} +
{} + passa os caminhos em lotes que cabem na linha de comando, preservando espaços nos argumentos; -- encerra as opções de file. Isso evita erros na passagem dos nomes, mas a apresentação visual de file ainda pode ser ambígua para certos caracteres. Acrescente -E antes de -- se a automação precisar receber falhas de leitura como retorno não zero.
Usar MIME em um script
Salve o script completo abaixo como check-image.sh e execute bash check-image.sh "caminho/da/imagem" com um arquivo de teste existente. Sem argumento, ele consulta upload.bin na pasta atual. -E faz a falha de leitura chegar ao tratamento de erro antes do case; uma classificação data ou um tipo fora da lista é rejeitado no outro ramo. Execute o arquivo com Bash, sem carregá-lo com source, pois ele usa exit.
path=${1:-upload.bin}
case "$path" in
-) path='./-' ;;
esac
mime_type=$(file -E -b --mime-type -- "$path") || {
printf '%s\n' 'Não foi possível determinar o tipo do arquivo.' >&2
exit 1
}
case "$mime_type" in
image/jpeg|image/png|image/webp)
printf '%s\n' "Formato de imagem aceito: $mime_type"
;;
*)
printf '%s\n' "Formato não aceito: $mime_type" >&2
exit 1
;;
esac
Para JPEG, PNG ou WebP reconhecido, a mensagem informa o tipo e o script termina com 0. Para outro tipo ou falha de leitura, ele escreve em erro padrão e termina com 1. Isso é classificação, não um validador completo de uploads: a orientação de upload da OWASP recomenda combinar limites de tamanho, validação de conteúdo por ferramentas adequadas, armazenamento separado, permissões restritas e outras medidas conforme a aplicação. O script não move, decodifica nem autoriza a publicação do arquivo.
Resumo das principais opções
| Opção | Descrição |
|---|---|
-b, --brief |
Omitir prefixos de nome de arquivo na saída. |
-i, --mime |
Exibe o tipo MIME e a codificação de caracteres. |
--mime-type |
Exibe apenas o tipo MIME. |
--mime-encoding |
Exibe apenas as informações de codificação de caracteres. |
-L, --dereference |
Segue links simbólicos para verificar o arquivo de destino. |
-h, --no-dereference |
Verifica o link em si sem seguir links simbólicos. |
-z, --uncompress |
Tenta analisar o conteúdo de formatos compactados compatíveis. |
-k, --keep-going |
Continua verificando outras correspondências mágicas mesmo após a primeira correspondência. |
-f arquivo |
Lê uma lista de caminhos a serem verificados a partir do arquivo especificado. |
-F separador |
Altera o delimitador entre o nome do arquivo e o resultado. |
-N, --no-pad |
Remove espaços de alinhamento dos nomes, sem reordenar as entradas. |
-p, --preserve-date |
Tenta preservar o tempo de acesso dos arquivos antes da verificação em sistemas compatíveis. |
-s, --special-files |
Lê e verifica arquivos especiais, como dispositivos de bloco ou de caractere. Use apenas quando compreender os riscos do acesso a dispositivos. |
-E |
Faz com que erros do sistema de arquivos terminem com uma mensagem de erro e status de falha em vez de serem tratados como resultados normais. |
-- |
Encerra o processamento de opções para passar com segurança nomes de arquivos que começam com um hífen. |
Limites da classificação
Entender a estimativa
file classifica arquivos com base em padrões conhecidos e heurísticas. Arquivos danificados, formatos novos ou raros, ou arquivos que combinam múltiplos formatos podem produzir resultados ambíguos ou inesperados.
Separar identificação e validação de segurança
Mesmo que identificado como uma imagem ou documento, isso não significa que não haja dados maliciosos dentro. Em ambientes sensíveis à segurança, consulte a extensão, o tipo MIME e a identificação por assinaturas em conjunto, e utilize analisadores dedicados e verificação baseada em políticas.
Limitar entradas especiais e grandes
Ler arquivos de dispositivos com -s ou verificar dados comprimidos com -z pode ser mais arriscado e custoso do que verificações normais de arquivos. Verifique a origem e o tamanho do alvo e execute com privilégios mínimos.
Perguntas frequentes
O comando file verifica extensões de arquivos?
A classificação usual usa metadados, assinaturas e características do texto, em vez de depender da extensão do nome. Renomear um PNG para .bin não altera seus bytes e ele ainda pode ser reconhecido como PNG. O resultado continua sendo uma estimativa, não uma validação integral do formato.
Como posso exibir apenas o tipo MIME sem o nome do arquivo?
Use file -b --mime-type -- "arquivo", substituindo o campo pelo caminho real. -b omite o nome e --mime-type seleciona somente o tipo. Um nome literal - deve ser escrito como ./- para não ler a entrada padrão.
Como posso verificar o tipo de arquivo do alvo de um link simbólico?
Use file -L -- "link" para seguir o link, substituindo o campo pelo nome real. file -h -- "link" consulta o próprio link. Em scripts, trate também o retorno e os diagnósticos para um link quebrado.
Por que file informa apenas data?
Pode ser porque não há nenhum padrão conhecido correspondendo ao banco de dados de magic e ele não pode ser identificado como texto. O arquivo também pode estar corrompido, muito curto, ou o banco de dados de magic instalado pode não reconhecer esse formato.




