Comando de arquivo Linux classificando arquivos

17

Eu preciso reconhecer o tipo de dados contidos em arquivos aleatórios. Eu sou novo no Linux.

Estou planejando usar o filecomando para entender que tipo de dados um arquivo possui. Eu tentei esse comando e obtive a saída abaixo.

Alguém me sugeriu que o filecomando analise os bytes iniciais de um arquivo para determinar o tipo de dados. O filecomando não olha para uma extensão de arquivo. Isso está correto? Eu olhei para a página de manual, mas achei que era muito técnica. Eu gostaria que alguém pudesse fornecer um link com uma explicação muito mais simples sobre como o filecomando funciona.

Quais são as diferentes respostas possíveis que eu poderia obter após executar o filecomando? Por exemplo, na transcrição abaixo, recebo JPEG, mídia ISO, ASCII, etc:

A saída da tela é a seguinte

 m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data


Atualização 1

Obrigado pelas respostas e eles esclareceram algumas coisas para mim.

Portanto, se eu entendi corretamente, a pasta / usr / share / mime / magic possui um banco de dados que me fornecerá quais são os possíveis formatos de arquivo atuais (saídas que posso obter quando digito o comando file e o sigo por um arquivo). isso está correto? É verdade que sempre que a saída do comando 'Arquivo' contiver a palavra "texto", ela se refere a algo que você pode ler com um visualizador de texto e qualquer coisa sem "texto" é algum tipo de binário?

user2543622
fonte
6
No futuro, postar uma imagem da saída do terminal não é realmente recomendado (ou apreciado por ninguém). Use a formatação do bloco do código de remarcação.
precisa saber é o seguinte
3
Tirei a foto e postei o código.
user2543622
Apenas como uma observação: se o arquivo não pode identificar um arquivo, geralmente o TrID pode. ele possui seu próprio banco de dados de características de arquivo, criado pela comunidade que o utiliza.
Josef diz Restabelecer Monica

Respostas:

13

file usa vários tipos de teste :

1: Se o arquivo não existe, não pode ser lido ou seu status não pode ser determinado, a saída deve indicar que o arquivo foi processado, mas que seu tipo não pôde ser determinado.

Isso será produzido como cannot open file: No such file or directory.

2: Se o arquivo não for regular, seu tipo de arquivo deve ser identificado. O diretório de tipos de arquivo, FIFO, soquete, bloco especial e caractere especial devem ser identificados como tal. Outros tipos de arquivos definidos pela implementação também podem ser identificados. Se o arquivo é um link simbólico, por padrão, o link deve ser resolvido e o arquivo deve testar o tipo de arquivo referenciado pelo link simbólico. (Veja as opções -he -iabaixo.)

Isso será produzido como .: directorye /dev/sda: block special. Grande parte do formato para isso e o ponto anterior é parcialmente definido pelo POSIX - você pode confiar em certas strings na saída.

3: Se o tamanho do arquivo for zero, ele deve ser identificado como um arquivo vazio.

Isto é foo: empty.

4: O utilitário de arquivo deve examinar um segmento inicial do arquivo e adivinhar a identificação de seu conteúdo com base em testes sensíveis à posição. (Não é garantido que a resposta esteja correta; consulte as opções -d, -M e -m abaixo.)

5: O utilitário de arquivo deve examinar o arquivo e adivinhar a identificação de seu conteúdo com base em testes de sistema padrão sensíveis ao contexto. (Não é garantido que a resposta esteja correta.)

Esses dois usam a identificação de número mágico e são a parte mais interessante do comando. Um número mágico é uma sequência especial de bytes que está em um local conhecido em um arquivo que identifica seu tipo. Tradicionalmente, esse local são os dois primeiros bytes, mas o termo foi estendido ainda mais para incluir cadeias mais longas e outros locais. Veja esta outra pergunta para obter mais detalhes sobre números mágicos no filecomando.

O filecomando possui um banco de dados desses números e a que tipo eles correspondem; esse banco de dados geralmente está dentro /usr/share/mime/magice mapeia o conteúdo do arquivo para os tipos MIME . A saída lá (geralmente parte file -ise você não a obtiver por padrão) será um tipo de mídia definido ou uma extensão . Os "testes sensíveis ao contexto" usam o mesmo tipo de abordagem, mas são um pouco mais confusos. Não é garantido que nenhum deles esteja certo, mas pretende ser um bom palpite.

filetambém possui um banco de dados mapeando esses tipos para nomes, pelo qual saberá que um arquivo identificado como application/pdfpode ser descrito como a PDF document. Esses nomes legíveis por humanos também podem ser localizados em outro idioma. Essas sempre serão algumas descrições de alto nível do tipo de arquivo de uma maneira que uma pessoa entenderá, e não uma máquina.

A maioria dos resultados diferentes que você pode obter virá desses estágios. Você pode procurar no magicarquivo uma lista de tipos suportados e como eles são identificados - meu sistema conhece 376 tipos diferentes. Os nomes fornecidos e os tipos suportados são determinados pelo pacote e pela configuração do sistema e, portanto, o sistema pode suportar mais ou menos que o meu, mas geralmente existem muitos deles. libmagictambém inclui testes adicionais codificados nele.

6: O arquivo deve ser identificado como um arquivo de dados.

Isto é foo: data, quando ele não conseguiu descobrir nada sobre o arquivo.

Existem também outras pequenas etiquetas que podem aparecer. Um +xarquivo executável ( ) incluirá " executable" na saída, geralmente separados por vírgula. A fileimplementação também pode saber coisas extras sobre alguns formatos de arquivo para poder descrever pontos adicionais sobre eles, como no seu " PDF document, version 1.4".

Michael Homer
fonte
8

As páginas de manual geralmente são referências concisas, não introduções. Comece com a página da Wikipedia .

fileolha apenas para o conteúdo do arquivo, não para o nome do arquivo. (Ele também analisa alguns metadados de arquivo, como o tipo de arquivo: diretório, link simbólico, pipe nomeado, etc. Mas nos casos em que você está interessado, é o conteúdo que importa.)

filenormalmente adivinha o formato de um arquivo, observando os primeiros bytes e comparando-os com uma tabela interna de números mágicos . Por exemplo, se o arquivo começa com %PDF, então filereporta "documento PDF" (e vai mais fundo para informar a versão mínima). Para tipos de arquivo que não começam com números mágicos, ele contém heurísticas, por exemplo, relate "texto ASCII" se os primeiros bytes estiverem todos no intervalo ASCII imprimível.

A saída de fileé frágil: pode variar de variante unix para variante unix e de versão para versão. No Linux, Cygwin e * BSD, o filecomando suporta uma opção -ique produz resultados previsíveis na forma de um tipo de mídia MIME (a IANA gerencia a lista de tipos de mídia padrão ). Não há tantos detalhes e a saída é menos amigável ao ser humano, mas a saída é previsível e amigável ao computador.

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

Use file --mime-typese você deseja apenas o tipo MIME em si, sem informações de codificação, por exemplo application/pdf. Passe a opção -bse você não quiser exibir o nome do arquivo no início da linha.

Gilles 'SO- parar de ser mau'
fonte
5

Gostaria que você lesse a resposta aqui . Alguns trechos da resposta são:

Na página de filecomando do homem ,

file Na verdade, o comando executa três testes para determinar o tipo de arquivo.

Primeiro teste

Os testes do sistema de arquivos são baseados no exame do retorno de uma chamada de sistema stat (2).

Segundo teste

Os testes de número mágico são usados ​​para verificar arquivos com dados em formatos fixos específicos.

Terceiro teste

Os testes de idioma procuram por seqüências específicas (cf names.h) que podem aparecer em qualquer lugar nos primeiros blocos de um arquivo. Por exemplo, a palavra-chave .br indica que o arquivo é provavelmente um arquivo de entrada troff (1), assim como a palavra-chave struct indica um programa em C.

A saída do filecomando geralmente é baseada no resultado de qualquer um dos testes bem-sucedidos.

Agora, supondo que o programa C ++ comece assim, e o terceiro teste seja bem-sucedido,

#include <iostream.h>
bla
bla

Conforme o terceiro teste, a palavra-chave #includeespecifica particularmente que é do tipo C , embora tenhamos um programa de CPP em mãos. Agora, quando eu checo,

$ file example.cpp

example.cpp: ASCII C program text

Agora, os conceitos de orientação a objetos são específicos para C ++. Vamos criar um arquivo específico para C ++ .

Inicio meu programa C ++ como,

Class something
{
}
bla
bla

Agora, quando eu emitir

$ file example.cpp

A saída é,

example.cpp: ASCII C++ program text

Isso basicamente explica como o filecomando funciona em arquivos semelhantes (neste exemplo, o programa C e o programa C ++ são tratados da mesma forma, a menos e até que utilizemos os recursos orientados a objetos específicos do C ++).

Ramesh
fonte
1

Gilles e Michael Homer forneceram excelentes respostas. ao qual te refiro. Para ver os tipos de arquivos reconhecidos no seu sistema, tente executar

cat /usr/share/magic

Se isso der problemas de permissão ou não existir, possivelmente

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(pode precisar de ajustes dependendo do seu sistema), o que deve mostrar uma lista de tipos de arquivos no seu sistema. Esse comando pode levar muito tempo para ser executado, dependendo do tamanho do seu sistema de arquivos raiz.

Warwick
fonte