Comando file: Detectando Tipos de Arquivo

Comando file: Detectando Tipos de Arquivo

O Que Voce Vai Aprender

  • Como o comando file julga o tipo de um arquivo pelo conteudo, nao pela extensao
  • Por que file vee alem de uma extensao renomeada
  • Como ler um tipo MIME com file -i
  • Opcoes uteis como -b e tratamento de arquivos comprimidos

Resumo Rapido

  • file NOME diz o que um arquivo realmente e de uma so vez
  • Ele decide com base nos bytes iniciais (o magic number), nao na extensao
  • Renomeie um JPEG para .txt e file ainda o identifica como JPEG

Premissas

  • SO: Ubuntu / Linux tipico
  • file ja vem pre-instalado (seu proprio pacote file, separado do coreutils)

1. O Que e o Comando file e Como Ele Difere das Extensoes?

Conclusao: file le o conteudo de um arquivo para determinar seu tipo, julgando pelos bytes reais em vez da extensao autodeclarada.

Lina: Eu nao posso simplesmente ler a extensao, tipo foto.jpg, para saber o tipo?
Veterano Linny: Normalmente, sim. Mas uma extensao e "autodeclarada." Renomeie o arquivo e o nome pode discordar do conteudo. O comando file le o conteudo em si para decidir.
Lina: Ler o conteudo? Eu nao 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 e o que eu sou." Esse marcador e chamado de magic number, e o file o le.
file report.pdf
report.pdf: PDF document, version 1.7

file depende de um banco de dados de padroes (libmagic) compilado em magic.mgc (fonte em /usr/share/misc/magic). Milhares de assinaturas de formato estao registradas la.

2. Por Que Voce Nao Pode Confiar na Extensao?

Conclusao: Uma extensao e apenas parte do nome e nao garante nada. Como file julga pelo conteudo, nao e enganado por uma extensao falsa.

Lina: Quando uma extensao nao confiavel realmente causa problemas?
Veterano Linny: Digamos que voce acidentalmente renomeie uma imagem para .txt, ou um arquivo do Windows chegue sem extensao. Nesses casos, voce quer confirmar o conteudo 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 conteudo, nao o nome. O mesmo vale para arquivos sem extensao alguma.

3. Como Usar o Comando file?

Conclusao: file NOME e a forma basica. Passe varios nomes ou um curinga para verificar muitos arquivos de uma vez.

Lina: Me mostra o uso basico.
Veterano Linny: Basta passar um nome de arquivo. Voce pode listar varios, 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

Diretorios, links simbolicos e arquivos vazios sao identificados como directory, symbolic link to ... e empty respectivamente.

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

Conclusao: file -i retorna um tipo MIME como text/plain; charset=us-ascii, que e conveniente para scripts.

Lina: Aquela notacao text/plain que eu vejo as vezes — o file pode imprimir isso?
Veterano Linny: Adicione -i (--mime) e voce obtem a forma de tipo MIME, que e facil para programas parsearem. O conjunto de caracteres (charset) tambem e mostrado.
file -i notes.txt
file -i report.pdf
notes.txt: text/plain; charset=us-ascii
report.pdf: application/pdf; charset=binary

Quando voce quer apenas o tipo ou apenas a codificacao, use --mime-type / --mime-encoding.

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

5. Quais Opcoes Vale a Pena Conhecer?

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

Opcao Significado
-b / --brief Imprimir apenas o tipo, sem o nome do arquivo
-i / --mime Saida em formato de tipo MIME
-L Seguir link simbolico e julgar seu destino
-z Olhar dentro de arquivo comprimido para julga-lo
-s Ler arquivos de dispositivo de bloco / caractere
-k Continuar em vez de parar na primeira correspondencia
Lina: Quando -b e util?
Veterano Linny: Quando um script consome a saida. O nome do arquivo no inicio atrapalha, entao se voce quer apenas o tipo, -b e mais facil.
file -b script.sh
Bourne-Again shell script, ASCII text executable

Com -z voce pode confirmar "que tipo de compressao mais o tipo do arquivo interno" sem descompactar um .gz.

file -z logs.tar.gz

6. Onde Ele e Usado no Trabalho Real?

Conclusao: Confirmar a identidade de um arquivo baixado, distinguir texto de binario e verificar um arquivo comprimido antes de extrair sao usos comuns.

Lina: Onde eu realmente usaria isso no trabalho?
Veterano Linny: Por exemplo, para confirmar que um arquivo que voce baixou com curl e realmente o que voce queria. Uma unica verificacao com file diz se uma pagina 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, voce baixou uma pagina de erro, nao um arquivo comprimido. Detectar isso antes da extracao e o valor do file.

7. Quais Sao as Armadilhas Comuns?

Conclusao: file faz uma estimativa, nao uma garantia. Esquecer -L para symlinks ou -s para arquivos de dispositivo e voce obtem resultados inesperados.

Lina: Quando eu executei file em um link simbolico, ele so mostrou informacao sobre o link em si.
Veterano Linny: Por padrao, ele inspeciona o link em si. Para julgar o conteudo real do destino, adicione -L.
file -L /usr/bin/python3

8. Mini Exercicio

Conclusao: A pratica hands-on fixa o conhecimento. Confirme voce mesmo que file vee alem de uma extensao alterada.

Tente Voce

  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 extensao muda?
Resposta Exemplo

Imprime sample.bin: ASCII text. O conteudo nao mudou, entao o veredito (ASCII text) tambem nao muda — prova de que file nao depende da extensao.

Proxima Leitura