Comando de archivos de Linux clasificando archivos

17

Necesito reconocer el tipo de datos contenidos en archivos aleatorios. Soy nuevo en Linux.

Estoy planeando usar el filecomando para comprender qué tipo de datos tiene un archivo. Intenté ese comando y obtuve el resultado a continuación.

Alguien me sugirió que el filecomando mira los bytes iniciales de un archivo para determinar el tipo de datos. El filecomando no busca en absoluto una extensión de archivo. ¿Es eso correcto? Miré la página de manual pero sentí que era demasiado técnica. Agradecería si alguien puede proporcionar un enlace que tenga una explicación mucho más simple sobre cómo funciona el filecomando.

¿Cuáles son las diferentes respuestas posibles que podría obtener después de ejecutar el filecomando? Por ejemplo, en la transcripción a continuación obtengo JPEG, medios ISO, ASCII, etc.

La salida de la pantalla es la siguiente

 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


Actualización 1

Gracias por las respuestas y me aclararon un par de cosas.

Entonces, si entiendo correctamente, la carpeta / usr / share / mime / magic tiene una base de datos que me dará cuáles son los formatos de archivo posibles actuales (salidas que puedo obtener cuando escribo el comando de archivo y lo sigo por un archivo). ¿Es eso correcto? ¿Es cierto que cada vez que la salida del comando 'Archivo' contiene la palabra "texto" se refiere a algo que puede leer con un visor de texto, y cualquier cosa sin "texto" es algún tipo de binario?

usuario2543622
fuente
66
En el futuro, publicar una imagen de salida del terminal realmente no se recomienda (ni es disfrutado por nadie). Utilice el formato de bloque de código de rebaja.
HalosGhost
3
Quité la foto y publiqué el código.
user2543622
Solo como una nota: si el archivo no puede identificar un archivo, a menudo puede TrID . Tiene su propia base de datos de características de archivo, creada por la comunidad que la utiliza.
Josef dice Reinstate Monica el

Respuestas:

13

file utiliza varios tipos de prueba :

1: Si el archivo no existe, no se puede leer, o no se pudo determinar su estado, el resultado indicará que el archivo se procesó, pero que su tipo no se pudo determinar.

Esto saldrá como cannot open file: No such file or directory.

2: Si el archivo no es un archivo normal, se identificará su tipo de archivo. El directorio de tipos de archivo, FIFO, socket, bloque especial y carácter especial se identificarán como tales. También se pueden identificar otros tipos de archivos definidos por la implementación. Si el archivo es un enlace simbólico, por defecto el enlace se resolverá y el archivo probará el tipo de archivo al que hace referencia el enlace simbólico. (Consulte las opciones -hy más -iabajo).

Esto se generará como .: directoryy /dev/sda: block special. Gran parte del formato para este y el punto anterior está parcialmente definido por POSIX : puede confiar en que ciertas cadenas estén en la salida.

3: Si la longitud del archivo es cero, se identificará como un archivo vacío.

Esto es foo: empty.

4: La utilidad de archivo examinará un segmento inicial de archivo y hará una suposición para identificar su contenido en base a pruebas sensibles a la posición. (No se garantiza que la respuesta sea correcta; consulte las opciones -d, -M y -m a continuación).

5: La utilidad de archivo examinará el archivo y adivinará la identificación de su contenido en base a pruebas de sistema predeterminadas sensibles al contexto. (No se garantiza que la respuesta sea correcta).

Estos dos usan la identificación del número mágico y son la parte más interesante del comando. Un número mágico es una secuencia especial de bytes que se encuentra en un lugar conocido en un archivo que identifica su tipo. Tradicionalmente, ese lugar son los primeros dos bytes, pero el término se ha ampliado aún más para incluir cadenas más largas y otras ubicaciones. Vea esta otra pregunta para obtener más detalles sobre los números mágicos en el filecomando.

El filecomando tiene una base de datos de estos números y a qué tipo corresponden; esa base de datos generalmente está en /usr/share/mime/magicy asigna el contenido del archivo a tipos MIME . El resultado allí (a menudo parte de file -isi no lo obtiene por defecto) será un tipo de medio definido o una extensión. Las "pruebas sensibles al contexto" utilizan el mismo tipo de enfoque, pero son un poco más difusas. No se garantiza que ninguno de estos sea correcto, pero están destinados a ser buenas conjeturas.

filetambién tiene una base de datos que asigna esos tipos a nombres, por lo que sabrá que un archivo que ha identificado application/pdfpuede describirse como a PDF document. Esos nombres legibles por humanos también pueden estar localizados en otro idioma. Estos siempre serán una descripción de alto nivel del tipo de archivo de una manera que una persona lo entienda, en lugar de una máquina.

La mayoría de los diferentes resultados que puede obtener vendrán de estas etapas. Puede consultar el magicarchivo para obtener una lista de los tipos admitidos y cómo se identifican: mi sistema conoce 376 tipos diferentes. Los nombres dados y los tipos admitidos están determinados por el empaquetado y la configuración de su sistema, por lo que su sistema puede admitir más o menos que el mío, pero generalmente hay muchos de ellos. libmagictambién incluye pruebas codificadas adicionales en él.

6: El archivo se identificará como un archivo de datos.

Esto es foo: data, cuando no pudo descubrir nada sobre el archivo.

También hay otras pequeñas etiquetas que pueden aparecer. Un archivo ejecutable ( +x) incluirá " executable" en la salida, generalmente separados por comas. La fileimplementación también puede conocer cosas adicionales sobre algunos formatos de archivo para poder describir puntos adicionales sobre ellos, como en su " PDF document, version 1.4".

Michael Homer
fuente
8

Las páginas de manual suelen ser referencias breves, no introducciones. Comience con la página de Wikipedia .

filesolo mira el contenido del archivo, no el nombre del archivo. (También analiza algunos metadatos de archivo, como el tipo de archivo: directorio, enlace simbólico, canalización con nombre, etc. Pero en los casos que le interesan, lo que importa es el contenido).

filenormalmente adivina el formato de un archivo al mirar los primeros bytes y compararlos con una tabla integrada de números mágicos . Por ejemplo, si el archivo comienza con %PDF, luego fileinforma “documento PDF” (y continúa cavando para informar la versión mínima). Para los tipos de archivo que no comienzan con números mágicos, contiene heurística, por ejemplo, informe "texto ASCII" si los primeros bytes están todos en el rango ASCII imprimible.

La salida de filees frágil: puede variar de una variante de Unix a una variante de Unix y de una versión a otra. En Linux, Cygwin y * BSD, el filecomando admite una opción -ique produce resultados predecibles en forma de un tipo de medio MIME (IANA gestiona la lista de tipos de medios estándar ). No hay tantos detalles y la salida es menos amigable para los humanos, pero la salida es predecible y amigable para la computadora.

$ 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

Úselo file --mime-typesi solo desea el tipo MIME en sí mismo sin codificar información, por ejemplo application/pdf. Pase la opción -bsi no desea mostrar el nombre del archivo al comienzo de la línea.

Gilles 'SO- deja de ser malvado'
fuente
5

Me gustaría que leyeras la respuesta desde aquí . Algunos de los extractos de la respuesta son,

Desde la página de filecomando man ,

file El comando realmente realiza 3 pruebas para determinar el tipo de archivo.

Primer examen

Las pruebas del sistema de archivos se basan en el examen del retorno de una llamada al sistema stat (2).

Segunda prueba

Las pruebas de números mágicos se utilizan para verificar archivos con datos en formatos fijos particulares.

Tercera prueba

Las pruebas de idioma buscan cadenas particulares (cf names.h) que pueden aparecer en cualquier lugar de los primeros bloques de un archivo. Por ejemplo, la palabra clave .br indica que el archivo es probablemente un archivo de entrada troff (1), tal como la palabra clave struct indica un programa en C.

El resultado del filecomando generalmente se basa en el resultado de cualquiera de las pruebas que tiene éxito.

Ahora, suponiendo que el programa C ++ comience así, y la tercera prueba tenga éxito,

#include <iostream.h>
bla
bla

Según la tercera prueba, la palabra clave #includeespecifica particularmente que es del programa tipo C , aunque tenemos un programa CPP en la mano. Ahora, cuando reviso,

$ file example.cpp

example.cpp: ASCII C program text

Ahora, los conceptos de orientación a objetos son específicos de C ++. Permítanos crear un archivo específico para C ++ .

Comienzo mi programa C ++ como,

Class something
{
}
bla
bla

Ahora, cuando publico

$ file example.cpp

La salida es,

example.cpp: ASCII C++ program text

Básicamente, esto explica cómo filefunciona el comando en archivos similares (en este ejemplo, el programa C y el programa C ++ se tratan por igual a menos y hasta que usemos las funciones orientadas a objetos específicas de C ++).

Ramesh
fuente
1

Gilles y Michael Homer han proporcionado excelentes respuestas. a lo que me refiero. Para ver los tipos de archivos reconocidos en su sistema, intente ejecutar

cat /usr/share/magic

Si eso da problemas de permisos, o no existe, entonces posiblemente

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

(puede necesitar ajustes dependiendo de su sistema) que debería mostrarle una lista de tipos de archivos en su sistema. Este comando puede tardar mucho tiempo en ejecutarse dependiendo del tamaño de su sistema de archivos raíz.

Warwick
fuente