Eu preciso reconhecer o tipo de dados contidos em arquivos aleatórios. Eu sou novo no Linux.
Estou planejando usar o file
comando 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 file
comando analise os bytes iniciais de um arquivo para determinar o tipo de dados. O file
comando 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 file
comando funciona.
Quais são as diferentes respostas possíveis que eu poderia obter após executar o file
comando? 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?
fonte
Respostas:
file
usa vários tipos de teste :Isso será produzido como
cannot open file: No such file or directory
.Isso será produzido como
.: directory
e/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.Isto é
foo: empty
.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
file
comando.O
file
comando possui um banco de dados desses números e a que tipo eles correspondem; esse banco de dados geralmente está dentro/usr/share/mime/magic
e mapeia o conteúdo do arquivo para os tipos MIME . A saída lá (geralmente partefile -i
se 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.file
também possui um banco de dados mapeando esses tipos para nomes, pelo qual saberá que um arquivo identificado comoapplication/pdf
pode ser descrito como aPDF 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
magic
arquivo 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.libmagic
também inclui testes adicionais codificados nele.Isto é
foo: data
, quando ele não conseguiu descobrir nada sobre o arquivo.Existem também outras pequenas etiquetas que podem aparecer. Um
+x
arquivo executável ( ) incluirá "executable
" na saída, geralmente separados por vírgula. Afile
implementaçã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
".fonte
As páginas de manual geralmente são referências concisas, não introduções. Comece com a página da Wikipedia .
file
olha 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.)file
normalmente 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ãofile
reporta "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, ofile
comando suporta uma opção-i
que 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.Use
file --mime-type
se você deseja apenas o tipo MIME em si, sem informações de codificação, por exemploapplication/pdf
. Passe a opção-b
se você não quiser exibir o nome do arquivo no início da linha.fonte
Gostaria que você lesse a resposta aqui . Alguns trechos da resposta são:
Na página de
file
comando do homem ,file
Na verdade, o comando executa três testes para determinar o tipo de arquivo.Primeiro teste
Segundo teste
Terceiro teste
A saída do
file
comando 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,
Conforme o terceiro teste, a palavra-chave
#include
especifica particularmente que é do tipo C , embora tenhamos um programa de CPP em mãos. Agora, quando eu checo,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,
Agora, quando eu emitir
A saída é,
Isso basicamente explica como o
file
comando 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 ++).fonte
Gilles e Michael Homer forneceram excelentes respostas. ao qual te refiro. Para ver os tipos de arquivos reconhecidos no seu sistema, tente executar
Se isso der problemas de permissão ou não existir, possivelmente
(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.
fonte