Linux / Comando / file: identificar formatos, tipos MIME y codificaciones
file estima el formato de un archivo mediante metadatos, patrones de bytes y características del texto. Puede reconocer archivos sin extensión o con un nombre incorrecto y mostrar tipos MIME y codificaciones; su resultado es una clasificación orientativa, no una garantía del formato completo ni de su seguridad.
En este artículo se explica desde el uso básico hasta la salida MIME, el manejo de enlaces simbólicos y archivos comprimidos, la inspección de varios archivos, el uso de scripts de shell y los puntos a tener en cuenta al interpretar los resultados.
¿Qué es el comando file?
file examina cada ruta tomada como argumento y muestra una descripción del tipo de archivo que sea fácil de leer para los humanos.
file README.md
file photo.jpg
file /usr/bin/ls
Los resultados pueden variar ligeramente según el sistema, la versión de file y la base de datos de magic. La forma de salida general es la siguiente.
README.md: Unicode text, UTF-8 text
photo.jpg: JPEG image data, JFIF standard 1.01
/usr/bin/ls: ELF 64-bit LSB pie executable, x86-64, dynamically linked
file lee y clasifica el contenido sin modificarlo. Sin embargo, se necesita permiso para acceder al archivo y, según el método de inspección, el tiempo de acceso puede actualizarse.
Principio mediante el cual file determina el tipo de archivo
La implementación general de file realiza las siguientes pruebas en orden y utiliza el resultado de la primera prueba exitosa como descripción predeterminada.
- Comprobación del sistema de archivos: Verifica tipos como directorios, enlaces simbólicos, sockets, FIFO y archivos vacíos mediante metadatos.
- Comprobación de magic: Compara los patrones de bytes únicos en ubicaciones específicas de los archivos con la base de datos de magic.
- Comprobación de texto y lenguaje: Examina la codificación de caracteres y las características del contenido para estimar el formato de texto o el idioma de creación.
Los archivos con información de identificación fija en su formato, como PNG, JPEG, PDF y archivos ejecutables ELF, pueden clasificarse incluso sin extensión. En cambio, si no tienen un patrón único o el contenido es demasiado corto y ambiguo, simplemente pueden marcarse como data.
Sintaxis y uso básico
file [OPCIONES] ARCHIVO ...
No solo se puede examinar un archivo, sino también múltiples rutas al mismo tiempo.
file report.pdf
file image.png archive.tar.gz script.sh
file /etc /dev/null /usr/bin/env
Las rutas con espacios o caracteres especiales de shell deben encerrarse entre comillas, y delante de nombres de archivos que comiencen con un guion se debe usar la marca de fin de opciones --.
file "annual report.pdf"
file -- -sample.bin
La versión instalada y las opciones admitidas se pueden verificar con el siguiente comando.
file --version
file --help
man file
Comparar la extensión con el formato real del archivo
Verificar el formato aunque no tenga extensión
En los archivos ejecutables o scripts de comandos de Linux, a menudo no tienen extensión. file comprueba el contenido en lugar del nombre, por lo que se puede verificar el formato.
file /usr/bin/bash
file /usr/bin/python3
file ./run-backup
Si el script tiene shebang, la información del intérprete puede incluirse en el resultado, y los programas compilados pueden mostrar el formato ELF, la arquitectura y si tienen enlace dinámico.
Comprobar archivos con extensión incorrecta
También es útil cuando el archivo descargado o recibido no coincide su extensión con el contenido real.
file download.dat
file attachment.bin
Aunque el resultado indique que es una imagen o un formato comprimido, no cambia automáticamente el nombre. Determine la extensión después de verificar los programas necesarios y las normas de trabajo.
Interpretar resultados frecuentes
| Expresiones representativas | Significado |
|---|---|
directory |
No es un archivo común, sino un directorio. |
symbolic link to ... |
Es un enlace simbólico que apunta a otra ruta. |
empty |
Es un archivo común vacío de 0 bytes. |
ASCII text |
Principalmente compuesto por caracteres imprimibles dentro del rango ASCII. |
Unicode text, UTF-8 |
Se ha determinado que es texto Unicode codificado en UTF-8. |
ELF ... executable |
Es un archivo ejecutable en formato ELF utilizado en Linux, entre otros. |
shared object |
Puede identificarse como una biblioteca compartida o un formato de ejecución independiente de la posición. |
data |
Datos binarios que no se pueden identificar suficientemente como un formato conocido o texto. |
cannot open |
No se pudo abrir el archivo debido a que no existe la ruta o por permisos u otros motivos. |
El resultado no garantiza la fiabilidad o seguridad del archivo. El hecho de que se reconozca con un formato específico y la determinación de que no contiene código malicioso son cuestiones distintas.
Verificar el tipo MIME y la codificación de caracteres
Ver MIME y codificación juntos con -i
-i o --mime muestran el tipo MIME y la codificación de caracteres en lugar de una larga descripción legible por humanos.
file -i index.html
file --mime README.md
Un archivo de texto puede mostrar el tipo MIME y charset juntos como sigue.
index.html: text/html; charset=utf-8
Mostrar solo tipo o codificación
--mime-type muestra solo el tipo MIME, --mime-encoding muestra solo la información de codificación.
file --mime-type image.webp
file --mime-encoding README.md
Si solo necesita el valor sin el nombre del archivo, utilice -b junto con él.
file -b --mime-type image.webp
file -b --mime-encoding README.md
Puede referirse a él en la configuración del servidor web o en la verificación de carga, pero no debe determinar que un archivo es seguro solo con el valor MIME enviado por el cliente o el resultado de file.
Ajustar los nombres de archivo y el espaciado en la salida
Usar -b para mostrar solo la descripción
La salida predeterminada tiene el formato ARCHIVO: DESCRIPCIÓN. -b o --brief omiten el prefijo del nombre del archivo.
file -b archive.tar.gz
file -b --mime-type photo.jpg
Es útil cuando solo se desea guardar el resultado en una variable de script.
Ajustar la salida de varios archivos con -N y -F
Cuando se inspeccionan varios archivos, los nombres de archivo pueden alinearse con el mismo ancho. -N elimina este espacio, mientras que -F cambia el separador entre el nombre del archivo y el resultado.
file -N file1 file-with-long-name.bin
file -F ' => ' file1 file2
En la automatización donde el nombre de archivo puede contener delimitadores o saltos de línea, en lugar de analizar directamente el formato de salida legible por humanos, considere la opción de separación NUL y el manejo seguro de la lista de archivos.
Verificar enlaces simbólicos
Verificar el enlace en sí
En el comportamiento predeterminado común, no se sigue el enlace simbólico y se muestran tanto el enlace como el destino. Para especificar este comportamiento, use -h o --no-dereference.
file -h current.log
Dado que el comportamiento predeterminado puede variar según la configuración de la variable de entorno POSIXLY_CORRECT, es más seguro especificar las opciones necesarias en los scripts.
Verificar el destino del enlace con -L
-L o --dereference siguen el enlace simbólico y verifican el formato real del archivo de destino.
file -L current.log
file --dereference latest-image
Los enlaces rotos no pueden abrir el archivo de destino, por lo que se mostrará un resultado sobre el enlace o un error.
Verificar archivos comprimidos y datos internos
Comprobar el formato de compresión en estado predeterminado
Si se verifica sin opciones, generalmente describe el formato de compresión externo como gzip, xz o bzip2.
file backup.tar.gz
file archive.xz
Descomprimir con -z para examinar el formato interno
-z o --uncompress descomprimen datos de formatos de compresión admitidos y también permiten inspeccionar el contenido interno.
file -z backup.tar.gz
file --uncompress archive.xz
El proceso de descompresión requiere tiempo y recursos adicionales. Los archivos grandes de fuentes no confiables o los archivos que podrían ser bombas de compresión deben manejarse en un entorno aislado con políticas de restricción separadas.
Verificar múltiples archivos y listas de archivos
Especificar múltiples archivos usando glob de shell
Puede verificar archivos de una extensión específica en el directorio actual de una sola vez.
file *.jpg
file *.sh
Cuando no hay archivos que coincidan con glob, la cadena del patrón puede pasarse tal cual según la configuración del shell. Si hay demasiados nombres de archivos, es posible superar el límite de longitud de la línea de comandos.
Leer la lista de nombres de archivos con -f
-f o --files-from leen una lista de rutas escritas una por línea para verificar.
file -f files-to-check.txt
file -F ' => ' -f files-to-check.txt
-f procesa la lista tan pronto como se encuentra la opción, por lo que las opciones que afectan la salida, como -F, deben colocarse antes.
Verificar la entrada estándar y los resultados de find
Verificar el formato de los datos en la entrada estándar
Si se especifica un guion simple - como nombre de archivo, se leen los datos desde la entrada estándar.
printf '%s\n' 'hello' | file -
La entrada estándar puede ser difícil de leer nuevamente, por lo que la precisión puede diferir de la verificación real de archivos.
Verificación recursiva con find -exec
Para examinar archivos regulares de manera recursiva hasta subdirectorios, se puede combinar con find.
find ./uploads -type f -exec file -- {} +
{} + agrupa las rutas encontradas en la mayor medida posible y las pasa a file, manejando de manera segura nombres de archivos con espacios. Si hay muchos objetivos de verificación, limite las rutas y la profundidad.
Uso de tipos MIME en scripts de shell
Prepare upload.bin en un directorio de prueba propio y con permiso de lectura. El siguiente ejemplo clasifica tres tipos MIME como imágenes y rechaza los demás con estado 1. Debe estar instalado file y su base de datos magic. Un error de lectura debe tratarse como un rechazo; para diagnosticarlo explícitamente, compruebe también el estado de la asignación de mime_type. MIME significa Multipurpose Internet Mail Extensions y aquí identifica la clase de contenido.
path='upload.bin'
mime_type=$(file -b --mime-type -- "$path")
case "$mime_type" in
image/jpeg|image/png|image/webp)
printf '%s\n' 'Formato de imagen admitido.'
;;
*)
printf '%s\n' "Formato no admitido: $mime_type" >&2
exit 1
;;
esac
Esta verificación es útil para una clasificación rápida, pero no reemplaza la verificación de seguridad. En el procesamiento real de cargas, se deben aplicar junto la limitación de tamaño de archivo, decodificador seguro, separación de rutas de almacenamiento, eliminación de permisos de ejecución y, según sea necesario, verificación de malware.
Resumen de opciones principales
| Opciones | Descripción |
|---|---|
-b, --brief |
Se omite el prefijo del nombre de archivo en la salida. |
-i, --mime |
Muestra el tipo MIME y la codificación de caracteres. |
--mime-type |
Muestra solo el tipo MIME. |
--mime-encoding |
Muestra solo la información de codificación de caracteres. |
-L, --dereference |
Sigue enlaces simbólicos y verifica el archivo de destino. |
-h, --no-dereference |
No sigue enlaces simbólicos, comprueba el enlace en sí. |
-z, --uncompress |
Descomprime archivos comprimidos soportados y verifica también el formato interno. |
-k, --keep-going |
Continúa verificando otras coincidencias de magic incluso después de la primera coincidencia. |
-f ARCHIVO |
Lee la lista de rutas a verificar desde el archivo especificado. |
-F SEPARADOR |
Cambiar el separador entre el nombre del archivo y el resultado. |
-N, --no-pad |
Eliminar los espacios para alinear los nombres de varios archivos de resultados. |
-p, --preserve-date |
Intentar preservar la hora de acceso al archivo antes de la verificación en los sistemas compatibles. |
-s, --special-files |
Leer y verificar archivos especiales como bloques o dispositivos de caracteres. Úselo solo cuando comprenda los riesgos de acceso al dispositivo. |
-E |
Evitar tratar los errores del sistema de archivos como resultados normales, y terminar con un mensaje de error y estado de fallo. |
-- |
Finalizar el procesamiento de opciones para pasar de manera segura los nombres de archivos que comienzan con un guion. |
Puntos a tener en cuenta al usar los resultados de file.
El resultado de la determinación es una estimación
file clasifica basándose en patrones conocidos y heurísticas. Los archivos dañados, los formatos nuevos o raros, y los archivos combinados de varios formatos pueden producir resultados ambiguos o inesperados.
El formato del archivo y la seguridad son diferentes
Aunque se identifique como imagen o documento, no significa que no contenga datos maliciosos en su interior. En los perímetros de seguridad, se deben considerar conjuntamente la extensión, el tipo MIME y la detección mágica, utilizando además un parser dedicado y la verificación basada en políticas.
Tenga cuidado con archivos especiales y entradas de gran tamaño
Leer archivos de dispositivos con -s o verificar datos comprimidos con -z puede ser más riesgoso y costoso que examinar archivos comunes. Verifique el origen y el tamaño del objetivo y ejecute con los mínimos privilegios.
FAQ
¿El comando file verifica la extensión del archivo?
La principal determinación se realiza utilizando la información del sistema de archivos y los patrones mágicos del contenido, la codificación de caracteres y las características del texto. Por lo tanto, incluso si carece de extensión o es incorrecta, se puede estimar el formato basado en el contenido real.
¿Cómo se puede mostrar solo el tipo MIME sin el nombre del archivo?
Se utiliza file -b --mime-type ARCHIVO. -b omite el prefijo del nombre del archivo y --mime-type solo selecciona el tipo MIME.
¿Cómo puedo verificar el tipo de archivo de un enlace simbólico?
Se utiliza file -L ENLACE. Para comprobar la información del propio enlace, use file -h ENLACE.
¿Por qué el resultado de file solo aparece como data?
Puede ser porque no hay un patrón conocido que coincida con la base de datos magic y tampoco se puede identificar como texto. El archivo puede estar dañado, ser demasiado corto o la base de datos magic instalada puede no reconocer ese formato.
Compare estas utilidades en Lista de comandos de uso frecuente en Linux.
Las reglas de reconocimiento se describen en Manual oficial del comando file, Documentación oficial de la base de datos magic de file y Repositorio oficial de file y libmagic.




