Comando file: Detectando Tipos de Arquivo

Comando file: Detectando Tipos de Arquivo

O Que Você Vai Aprender

  • Como o comando file julga o tipo de um arquivo pelo conteúdo, não pela extensão
  • Por que file vee além de uma extensão renomeada
  • Como ler um tipo MIME com file -i
  • Opções úteis como -b e tratamento de arquivos comprimidos

Resumo Rápido

  • file NOME diz o que um arquivo realmente é de uma só vez
  • Ele decide com base nos bytes iniciais (o magic number), não na extensão
  • Renomeie um JPEG para .txt e file ainda o identifica como JPEG

Premissas

  • SO: Ubuntu / Linux típico
  • file já vem pré-instalado (seu próprio pacote file, separado do coreutils)

1. O Que é o Comando file e Como Ele Difere das Extensões?

Conclusão: file lê o conteúdo de um arquivo para determinar seu tipo, julgando pelos bytes reais em vez da extensão autodeclarada.

Lina: Eu não posso simplesmente ler a extensão, tipo foto.jpg, para saber o tipo?
Veterano Linny: Normalmente, sim. Mas uma extensão é "autodeclarada." Renomeie o arquivo e o nome pode discordar do conteúdo. O comando file lê o conteúdo em si para decidir.
Lina: Ler o conteúdo? Eu não tenho que abrir o arquivo para ver o que tem dentro?
Veterano Linny: A maioria dos formatos coloca um marcador nos primeiros bytes que diz "isto é o que eu sou." Esse marcador é chamado de magic number, e o file o lê.
file report.pdf
report.pdf: PDF document, version 1.7

file depende de um banco de dados de padrões (libmagic) compilado em magic.mgc (fonte em /usr/share/misc/magic). Milhares de assinaturas de formato estão registradas lá.

2. Por Que Você Não Pode Confiar na Extensão?

Conclusão: Uma extensão é apenas parte do nome e não garante nada. Como file julga pelo conteúdo, não é enganado por uma extensão falsa.

Lina: Quando uma extensão não confiável realmente causa problemas?
Veterano Linny: Digamos que você acidentalmente renomeie uma imagem para .txt, ou um arquivo do Windows chegue sem extensão. Nesses casos, você quer confirmar o conteúdo real.
Lina: Vou tentar. Vou renomear uma imagem para .txt.
mv penguin.jpg penguin.txt
file penguin.txt
penguin.txt: JPEG image data, JFIF standard 1.01, resolution (DPI), 72x72
Lina: O nome diz .txt, mas ele ainda viu que era um JPEG!
Veterano Linny: Certo. Ele olha o conteúdo, não o nome. O mesmo vale para arquivos sem extensão alguma.

3. Como Usar o Comando file?

Conclusão: file NOME é a forma básica. Passe vários nomes ou um curinga para verificar muitos arquivos de uma vez.

Lina: Me mostra o uso básico.
Veterano Linny: Basta passar um nome de arquivo. Você pode listar vários, ou usar * para verificar todos juntos.
file notes.txt
file *
notes.txt: ASCII text
archive.tar.gz: gzip compressed data, original size modulo 2^32 10240
script.sh:  Bourne-Again shell script, ASCII text executable
image.png:  PNG image data, 800 x 600, 8-bit/color RGBA, non-interlaced

Diretórios, links simbólicos e arquivos vazios são identificados como directory, symbolic link to ... e empty respectivamente.

4. Como Obter o Tipo MIME? (-i)

Conclusão: file -i retorna um tipo MIME como text/plain; charset=us-ascii, que é conveniente para scripts.

Lina: Aquela notação text/plain que eu vejo às vezes — o file pode imprimir isso?
Veterano Linny: Adicione -i (--mime) e você obtém a forma de tipo MIME, que é fácil para programas parsearem. O conjunto de caracteres (charset) também é mostrado.
file -i notes.txt
file -i report.pdf
notes.txt: text/plain; charset=us-ascii
report.pdf: application/pdf; charset=binary

Quando você quer apenas o tipo ou apenas a codificação, use --mime-type / --mime-encoding.

file --mime-type photo.png
photo.png: image/png

5. Quais Opções Vale a Pena Conhecer?

Conclusão: Conhecer -b (omitir nome), -L (seguir links), -z (olhar dentro de arquivos comprimidos) e -s (arquivos de dispositivo) é suficiente para a maioria do trabalho.

Opção Significado
-b / --brief Imprimir apenas o tipo, sem o nome do arquivo
-i / --mime Saída em formato de tipo MIME
-L Seguir link simbólico e julgar seu destino
-z Olhar dentro de arquivo comprimido para julgá-lo
-s Ler arquivos de dispositivo de bloco / caractere
-k Continuar em vez de parar na primeira correspondência
Lina: Quando -b é útil?
Veterano Linny: Quando um script consome a saída. O nome do arquivo no início atrapalha, então se você quer apenas o tipo, -b é mais fácil.
file -b script.sh
Bourne-Again shell script, ASCII text executable

Com -z você pode confirmar "que tipo de compressão mais o tipo do arquivo interno" sem descompactar um .gz.

file -z logs.tar.gz

6. Onde Ele é Usado no Trabalho Real?

Conclusão: Confirmar a identidade de um arquivo baixado, distinguir texto de binário e verificar um arquivo comprimido antes de extrair são usos comuns.

Lina: Onde eu realmente usaria isso no trabalho?
Veterano Linny: Por exemplo, para confirmar que um arquivo que você baixou com curl é realmente o que você queria. Uma única verificação com file diz se uma página de erro HTML foi baixada no lugar.
curl -sL https://example.com/app.tar.gz -o app.tar.gz
file app.tar.gz
app.tar.gz: gzip compressed data, ...

Se disser HTML document aqui, você baixou uma página de erro, não um arquivo comprimido. Detectar isso antes da extração é o valor do file.

7. Quais São as Armadilhas Comuns?

Conclusão: file faz uma estimativa, não uma garantia. Esquecer -L para symlinks ou -s para arquivos de dispositivo e você obtém resultados inesperados.

Lina: Quando eu executei file em um link simbólico, ele só mostrou informação sobre o link em si.
Veterano Linny: Por padrão, ele inspeciona o link em si. Para julgar o conteúdo real do destino, adicione -L.
file -L /usr/bin/python3

8. Mini Exercício

Conclusão: A prática hands-on fixa o conhecimento. Confirme você mesmo que file vee além de uma extensão alterada.

Tente Você

  1. Crie algum texto: echo "hello" > sample.txt
  2. Verifique o tipo: file sample.txt
  3. Renomeie: mv sample.txt sample.bin
  4. Verifique novamente: file sample.bin — o resultado muda quando a extensão muda?
Resposta Exemplo

Imprime sample.bin: ASCII text. O conteúdo não mudou, então o veredito (ASCII text) também não muda — prova de que file não depende da extensão.

Próxima Leitura