Como os tipos de arquivos são conhecidos, se não a partir do sufixo do arquivo?

53

Gostaria de saber como os tipos de arquivos são conhecidos se os nomes de arquivos não tiverem sufixos.

Por exemplo, um arquivo chamado myfile pode ser binário ou texto para começar, como o sistema sabe se o arquivo é binário ou texto?

    
por Niklas Rosencrantz 03.06.2015 / 13:21

7 respostas

81

O utilitário file determina o tipo de arquivo de 3 maneiras:

Primeiro, os testes do sistema de arquivos : Dentro desses testes, um dos status chamadas do sistema familiar são invocadas no arquivo. Isso retorna os diferentes tipos de arquivo unix : arquivo, diretório, link, dispositivo de caractere, dispositivo de bloco, canal nomeado ou um soquete comum . Dependendo disso, os testes mágicos são feitos.

Os testes mágicos são um pouco mais complexos. Os tipos de arquivo são adivinhados por um banco de dados de padrões chamado arquivo mágico . Alguns tipos de arquivos podem ser determinados pela leitura de um bit ou número em um lugar específico dentro do arquivo (binários, por exemplo). O arquivo mágico contém " números mágicos " para testar o arquivo se ele os contém ou não e quais informações de texto devem ser impressas. Aqueles " números mágicos " podem ser valores de 1-4Byte, strings, datas ou mesmo expressões regulares. Com mais testes, informações adicionais podem ser encontradas. No caso de um executável, informações adicionais seriam se dinamicamente vinculado ou não, < href="http://en.wikipedia.org/wiki/Strip_%28Unix%29"> despojado ou não ou a arquitetura. Às vezes, vários testes devem passar antes que o tipo de arquivo possa ser identificado de verdade. Mas de qualquer forma, não importa quantos testes são realizados, é sempre apenas um bom palpite .

Aqui estão os primeiros 8 bytes em um arquivo com alguns tipos de arquivos comuns que podem nos ajudar a ter uma ideia de como esses números mágicos podem ser:

             Hexadecimal          ASCII
PNG   89 50 4E 47|0D 0A 1A 0A   ‰PNG|....
JPG   FF D8 FF E1|1D 16 45 78   ÿØÿá|..Ex
JPG   FF D8 FF E0|00 10 4A 46   ÿØÿà|..JF
ZIP   50 4B 03 04|0A 00 00 00   PK..|....
PDF   25 50 44 46|2D 31 2E 35   %PDF|-1.5

Se o tipo de arquivo não puder ser encontrado em testes mágicos, o arquivo parece ser um arquivo de texto e file procura pela codificação do conteúdo. A codificação é diferenciada pelos diferentes intervalos e sequências de bytes que constituem o texto imprimível em cada conjunto.

As quebras de linha também são investigadas, dependendo de seus valores HEX:

  • 0A ( \n ) classifica um arquivo terminado Un * x / Linux / BSD / OSX
  • 0D 0A ( \r\n ) são arquivos dos sistemas operacionais da Microsoft
  • 0D ( \r ) seria o Mac OS até a versão 9
  • 15 ( 5 ) seria IBMs AIX

Agora, os testes de idioma são iniciados. Se parecer ser um arquivo de texto, o arquivo será pesquisado em busca de determinadas cadeias para descobrir qual idioma contém (C, Perl, Bash). Algumas linguagens de script também podem ser identificadas pelo hashbang ( #!/bin/interpreter ) na primeira linha do script .

Se nada se aplicar ao arquivo, o tipo de arquivo não poderá ser determinado e file apenas imprimirá "data". Este também é o caso se o arquivo estiver criptografado .

Então, você vê que não há necessidade de um sufixo. Um sufixo de qualquer maneira poderia confundir, se definido errado.

    
por 03.06.2015 / 14:08
17

Muitas vezes, não se importa. Você apenas passa para um programa e ele o interpreta ou não. Pode não ser útil abrir um .jpg em um editor de texto, mas você não está impedido de fazer isso. A extensão, como o resto do nome do arquivo, é para a conveniência organizacional dos seres humanos.

Também pode ser possível construir arquivos que possam ser interpretados de maneira válida de várias maneiras. Como o formato de arquivo ZIP começa com um cabeçalho no final do arquivo , você pode colocar outras coisas na frente e ainda assim carregar como um arquivo ZIP. Isso é comumente usado para fazer arquivos zip de extração automática.

    
por 03.06.2015 / 16:25
13

Essa informação é comumente encontrada no cabeçalho do arquivo. O comando file analisa o destino e informa sobre o arquivo. Muitas informações são geralmente derivadas de cabeçalhos de arquivos, que geralmente são os primeiros bytes de um arquivo (veja abaixo). Os cabeçalhos são usados pelo sistema para descobrir como lidar com arquivos. #!/bin/bash no início de um arquivo informa ao sistema para usar o shell bash para interpretar o seguinte script. ELF informa ao sistema que este é um executável ELF.

[~] root@www # file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

[~] root@www # file /etc/passwd
/etc/passwd: ASCII text

Exemplos de cabeçalho de arquivo:

[root@server4 ~]# xxd old_sm_logo.png | head -5
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452  .PNG........IHDR
0000010: 0000 0134 0000 006f 0806 0000 0062 bf3c  ...4...o.....b.<

[root@server4 ~]# xxd /bin/ls | head -5
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 3e00 0100 0000 a024 4000 0000 0000  ..>......$@.....

[root@server4 proj]# xxd resizer.sh | head -5
0000000: 2321 2f62 696e 2f62 6173 680a 5b20 2d7a  #!/bin/bash.[ -z
0000010: 2022 2431 2220 5d20 2626 2065 6368 6f20   "$1" ] && echo
    
por 03.06.2015 / 13:24
7

A primeira coisa a verificar é o tipo de arquivo embutido que é reconhecido pelo kernel. Esses são os tipos de arquivo, como diretório, arquivo especial de caractere, arquivo especial de bloco, arquivo especial de pipe, soquete e link simbólico. Esta informação vem do inode do arquivo. Se o arquivo for simples, o próximo conjunto de informações virá dos primeiros 256 bytes, procurando por padrões. Assim, os arquivos de texto e o código-fonte C são reconhecidos examinando-se esses bytes. Além disso, os utilitários também procuram por um número mágico que é usado para testar e validar o tipo de arquivo. Você pode adicionar seus próprios tipos de arquivo para serem reconhecidos, adicionando as informações ao arquivo /etc/magic . Consulte a man page para magic(5) para ver o formato do arquivo mágico.

Na implementação mais antiga (Solaris, por exemplo), o arquivo /etc/magic enumerou a maioria dos tipos de arquivos reconhecidos.

    
por 03.06.2015 / 13:39
4

O comando file aplica algumas heurísticas de inspecionar (partes de) o arquivo e fazer uma estimativa qualificada. Além disso, existem alguns casos especiais em que informações adicionais podem ser obtidas; como o #! no início de um arquivo de texto, um BoM (byte order mark) ou bytes de cabeçalho específicos de formatos de arquivo executáveis. As marcas #! e binárias em executáveis são usadas pelo sistema para diferenciá-las.

    
por 03.06.2015 / 13:30
4

O sistema não sabe se um arquivo é binário ou texto. Em todos os sistemas operacionais do tipo Unix (AFAIK), fopen(path, "rb") é exatamente igual a fopen(path "r") - o b não tem efeito. É aceito porque o padrão C precisa ser portátil para alguns outros sistemas operacionais que fazem essa distinção.

    
por 03.06.2015 / 20:03
0

I would argue that "file type" is not even a meaningful concept under Unix;

Nos bons e velhos tempos dos mainframe commputers, seus sistemas operacionais suportavam vários tipos de arquivos, incluindo seqüenciais e index-sequenciais. Sistemas operacionais modernos (Un * x e, possivelmente, Windows) reduzem o conjunto de tipos de arquivos ao mínimo (incluindo o objeto compartilhado, executável).

It may also be possible to construct files that can be validly interpreted in multiple ways

É possível que exista um formato de arquivo complicado: um pedaço de código C que pode ser interpretado como uma descrição de imagem. Além disso, existem diferentes formatos cada vez menos específicos: arquivo de texto, arquivo XML, um documento SOAP.

    
por 06.06.2015 / 07:20