Arquivo de comando do Linux que classifica arquivos

14

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

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

Alguém sugeriu que o comando file examina os bytes iniciais de um arquivo para determinar o tipo de dados. O comando file não olha para uma extensão de arquivo. Isso está correto? Olhei para a página de manual , mas senti que era muito técnica. Eu apreciaria se alguém puder fornecer um link que tenha uma explicação muito mais simples sobre como o comando file funciona.

Quais são as diferentes respostas possíveis que eu consegui depois de executar o comando file ? Por exemplo, na transcrição abaixo eu pego 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.

Então, se eu entendi corretamente, a pasta / usr / share / mime / magic tem um banco de dados que me dará quais são os formatos de arquivo possíveis atuais (saídas que eu posso obter ao digitar o comando file e segui-lo por um arquivo). isso é 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?

    
por user2543622 19.08.2014 / 22:37

4 respostas

12

file usa vários tipos de teste :

1: If file does not exist, cannot be read, or its file status could not be determined, the output shall indicate that the file was processed, but that its type could not be determined.

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

2: If the file is not a regular file, its file type shall be identified. The file types directory, FIFO, socket, block special, and character special shall be identified as such. Other implementation-defined file types may also be identified. If file is a symbolic link, by default the link shall be resolved and file shall test the type of file referenced by the symbolic link. (See the -h and -i options below.)

Isso será exibido como .: directory e /dev/sda: block special . Muito do formato para este e o ponto anterior é parcialmente definido pelo POSIX - você pode depende de certas strings estarem na saída.

3: If the length of file is zero, it shall be identified as an empty file.

Isso é foo: empty .

4: The file utility shall examine an initial segment of file and shall make a guess at identifying its contents based on position-sensitive tests. (The answer is not guaranteed to be correct; see the -d, -M, and -m options below.)

5: The file utility shall examine file and make a guess at identifying its contents based on context-sensitive default system tests. (The answer is not guaranteed to be correct.)

Estes 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 seqüência especial de bytes que está em um local conhecido em um arquivo que identifica seu tipo. Tradicionalmente, esse lugar são os primeiros dois bytes, mas o termo foi estendido para incluir seqüências de caracteres mais longas e outros locais. Veja esta outra questão para mais detalhes sobre números mágicos no comando file .

O comando file tem um banco de dados desses números e a que tipo eles correspondem; esse banco de dados geralmente está em /usr/share/mime/magic e mapeia o conteúdo do arquivo para tipos MIME . A saída lá (geralmente parte de file -i se você não obtiver por padrão) será um tipo de mídia definido ou uma extensão. "Testes sensíveis ao contexto" usam o mesmo tipo de abordagem, mas são um pouco confusos. Nenhum deles tem a garantia de estar certo, mas eles pretendem ser bons palpites.

file também tem um banco de dados que mapeia esses tipos para nomes, com os quais ele saberá que um arquivo identificado como application/pdf pode ser descrito como PDF document . Esses nomes legíveis por humanos também podem estar localizados em outro idioma. Estas serão sempre algumas descrições de alto nível do tipo de arquivo de uma maneira que uma pessoa entenderá, em vez de uma máquina.

A maioria dos resultados diferentes que você pode obter virão desses estágios. Você pode examinar o arquivo magic para obter uma lista de tipos suportados e como eles são identificados - meu sistema conhece 376 tipos diferentes. Os nomes dados e os tipos suportados são determinados pelo empacotamento e pela configuração do sistema e, portanto, o sistema pode suportar mais ou menos que o meu, mas geralmente há muitos deles. libmagic também inclui testes adicionais codificados.

6: The file shall be identified as a data file.

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

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

    
por 20.08.2014 / 01:55
8

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

file examina apenas o conteúdo do arquivo, não o nome do arquivo. (Ele também analisa alguns metadados de arquivos, 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.)

file normalmente adivinha o formato de um arquivo, examinando os primeiros poucos bytes e comparando-os com uma tabela interna de números mágicos . Por exemplo, se o arquivo começar com %PDF , file informará “documento PDF” (e continuará pesquisando para informar a versão mínima). Para tipos de arquivo que não iniciam 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 comando file suporta uma opção -i , que produz resultados previsíveis na forma de um MIME tipo de mídia (a IANA gerencia o lista de tipos de mídia padrão ). Não há tantos detalhes e a saída é menos humana, 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-type se desejar apenas o próprio tipo MIME sem codificar informações, por exemplo, %código%. Passe a opção application/pdf se você não quiser exibir o nome do arquivo no começo da linha.

    
por 20.08.2014 / 02:00
5

Gostaria que você lesse a resposta de aqui . Alguns dos trechos da resposta são,

Da página man do comando file ,

O comando

file na verdade executa 3 testes para determinar o tipo de arquivo.

Primeiro teste

The filesystem tests are based on examining the return from a stat(2) system call.

Segundo teste

The magic number tests are used to check for files with data in particular fixed formats.

Terceiro teste

The language tests look for particular strings (cf names.h) that can appear anywhere in the first few blocks of a file. For example, the keyword .br indicates that the file is most likely a troff(1) input file, just as the keyword struct indicates a C program.

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

Agora, assumindo que o programa C ++ é iniciado assim e o terceiro teste é bem-sucedido,

#include <iostream.h>
bla
bla

De acordo com o terceiro teste, a palavra-chave #include especifica especificamente que é do tipo C , embora tenhamos um programa CPP em mãos. Agora, quando eu verificar,

$ file example.cpp

example.cpp: ASCII C program text

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

Eu 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 comando file 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 ++).

    
por 20.08.2014 / 02:15
1

Gilles e Michael Homer deram excelentes respostas. que eu me refiro a você. Para ver os tipos de arquivos reconhecidos em 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), que deve mostrar uma lista de tipos de arquivos em seu sistema. Esse comando pode levar muito tempo para ser executado, dependendo do tamanho do sistema de arquivos raiz.

    
por 20.08.2014 / 02:05