file é um programa de computador padrão do sistema operacional Unix para determinar o tipo de dados contido em um arquivo (ou o tipo de arquivo). Apareceu UNIX System V com mudanças muito importantes, sendo a mais notável a remoção das informações do tipo de arquivo para um arquivo de texto externo, ao invés de compilar estas informações no próprio arquivo binário.
A maioria das distribuições Linux e BSD contém uma reimplementação livre que foi escrita por Ian Darwin. Ela foi expandida por Geoff Collyer em 1989 e desde então teve contribuições de muitos outros, como Guy Harris, Chris Lowth e Eric Fischer.
Especificação
A Single UNIX Specification (SUS) especifica que uma série de testes devem ser executados no arquivo especificado na linha de comando:
- se o arquivo não pode ser lido, seu estado é indeterminado ou seu tipo é indeterminado, file irá indicar que o arquivo foi processado e seu tipo foi indeterminado;
- file deve ser capaz de determinar os tipos diretório, FIFO, Socket e arquivos especiais;
- arquivos vazios devem ser identificados como tal;
- uma parte inicial do arquivo deve ser analisada usando testes sensíveis à posição;
- todo o arquivo deve ser analisado usando testes sensíveis ao contexto;
- o arquivo é identificado como um arquivo de dados;
Os testes sensíveis à posição são normalmente implementados comparando várias posições dentro do arquivo com uma base de dados textual de números mágicos. Esta base de dados é implementada em um arquivo chamado "magic", localizado geralmente em /etc/magic, /usr/share/file/magic ou um local similar. Este método difere de outros mais simples como verificar a extensão dos arquivos e esquemas como MIME.
Uso
A SUS define como requisitos as seguintes opções:
- -M arquivo, especifica um arquivo especialmente formatado contendo testes sensíveis à posição; testes padrão sensíveis à posição e ao contexto não serão executados;
- -m arquivo, como -M, mas testes padrão serão executados após os contidos em arquivo;
- -d, executa testes padrão sensíveis à posição e ao contexto no arquivo; esse é o modo padrão, a menos que -M ou -m sejam especificados;
- -h, identifica ligações como tal, a menos que a ligação aponte para um arquivo inexistente;
- -i, não classifica o arquivo com uma identificação que não seja: não existente, diretório, FIFO, Socket, especial de bloco, especial de caractere, ligação simbólica, aquivo comum, arquivo vazio, arquivo não legível, executável, arquivo TAR, formato cpio estendido, formato TAR estendido, shell script, arquivo fonte em C, arquivo fonte Fortran ou arquivo de dados.
Outros sistemas operacionais Unix ou Unix-like podem adicionar opções extras além dessas.
Exemplos
# file arquivo.c arquivo.c: C program text
# file programa programa: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped
# file /dev/wd0a /dev/wd0a: block special (0/0)
# file -s /dev/hda1 /dev/hda1: Linux/i386 ext2 filesystem
# file -s /dev/hda5 /dev/hda5: Linux/i386 swap file
# file comprimido.gz comprimido.gz: gzip compressed data, deflated, original filename, `compressed', last modified: Thu Jan 26 14:08:23 2006, os: Unix
# file dados.ppm dados.ppm: Netpbm PPM "rawbits" image data
Referências
- «Especificações do Single Unix Specification» (em English)
Páginas do manual
- «file(1) - Páginas do manual» (em English)
Outras
- «Página da versão do file usada na maioria das distribuições BSD e Linux» (em English)
- «Versão online do programa file» (em English)