# La commande `file` sous Linux : au-delà des apparences

## Introduction

La commande `file` est souvent perçue comme un simple utilitaire Unix 
permettant de déterminer le type d’un fichier. En réalité, elle s’appuie sur un 
système bien plus fin et ancien que les extensions de fichier ou les en-têtes 
MIME modernes. Ce document explore le fonctionnement profond de `file`, ses 
bases heuristiques, son lien (ou son absence de lien direct) avec les types 
MIME, et la manière dont on peut étendre ou personnaliser son comportement. On 
y examinera aussi ses limites, notamment dans la reconnaissance de formats 
structurés mais non binaires comme Markdown ou les mails au format MH.

---

## Fonctionnement général

Lorsque vous exécutez une commande comme :

```bash
file nom_du_fichier
```

La commande `file` inspecte les **premiers octets** du fichier et les compare à 
une **base de règles appelée fichier `magic`**. Ces règles décrivent les 
signatures binaires attendues (appelées *magic numbers*) pour identifier de 
façon heuristique le contenu réel du fichier, indépendamment de son extension.

Exemple : un fichier sans extension contenant `%PDF-1.4` dans les premiers 
octets sera reconnu comme un fichier PDF.

---

## La base `magic`

Le fonctionnement repose sur un fichier binaire compilé, généralement situé ici 
:

```bash
/usr/share/file/magic.mgc
```

Ce fichier est issu d’un ensemble de définitions textuelles (`magic` ou 
`magic.mime`) compilées avec :

```bash
file -C -m /chemin/vers/magic
```

Ces fichiers décrivent :

* des motifs binaires à détecter,
* des offsets de lecture dans les fichiers,
* des types d’interprétation (int, string, etc.),
* et éventuellement des correspondances MIME (avec l’option `--mime-type`).

Il est donc **tout à fait possible d’étendre ou de surcharger ces fichiers** 
pour enrichir la reconnaissance.

---

## MIME et `file` : relation partielle

La commande `file` peut retourner un type MIME avec l’option :

```bash
file --mime-type fichier
```

Cependant, ce type MIME **n’est pas tiré d’une base comme `/etc/mime.types`** 
ou `xdg-mime`, mais bien d’une **correspondance ajoutée dans les règles 
`magic`**. Il peut donc être différent de celui qu’une application de bureau ou 
un navigateur web attribuerait au même fichier.

Il est important de noter que :

* `file` n’utilise **ni les extensions**,
* ni les bases MIME centralisées (comme `freedesktop.org`) directement,
* et fournit donc une **analyse plus bas-niveau, indépendante du contexte 
utilisateur**.

---

## Limites sur les formats structurés textuels (Markdown, MH, etc.)

Un des points faibles notables de `file` concerne les formats **textuels 
structurés mais sans signature binaire claire**, comme :

* **Markdown (.md)** : bien que largement utilisé, ce format est typiquement vu 
comme `ASCII text` ou `UTF-8 Unicode text`, sauf si un fichier `magic` 
personnalisé est introduit.
* **Courriers électroniques MH (Maildir ou MH format)** : ces fichiers sont 
souvent identifiés comme de simples `text/plain`, sans détection de structure 
de type `From_`, `Subject:`, ou entêtes MIME multipart.

Cela signifie que `file`, par défaut, **ne reconnaît pas les structures 
syntaxiques typiques de ces formats textuels**, sauf si une règle `magic` 
personnalisée a été définie. Cette faiblesse peut induire en erreur dans des 
environnements où les outils doivent faire la distinction entre des fichiers 
textuels génériques et des formats bien définis.

---

## Personnalisation / Debug

Pour examiner plus finement ce que `file` fait réellement :

```bash
file -k fichier     # retourne tous les types reconnus potentiels
file -i fichier     # équivalent à --mime
file -m mon_magic fichier   # utilise une base personnalisée
```

Et pour voir comment `file` lit un fichier étape par étape :

```bash
file -d fichier     # mode debug (verbeux)
```

Vous pouvez également créer vos propres définitions `magic`, par exemple :

```
0   string  %!PS    PostScript document
!:mime  application/postscript
```

---

## Conclusion

La commande `file` n’est pas une simple boîte noire : c’est un outil de 
reconnaissance heuristique puissant, indépendant des conventions modernes, qui 
**analyse le contenu réel du fichier**, et non son apparence. Pour des 
environnements techniques, de développement ou de diagnostic, elle reste un 
**outil irremplaçable**.

Cependant, il est essentiel de comprendre ses **limites sur les formats 
structurés purement textuels**, qui nécessitent souvent une personnalisation 
manuelle. Dans un monde où les métadonnées implicites (comme Markdown ou les 
emails MH) jouent un rôle croissant, `file` doit être vu **non comme une 
autorité universelle**, mais comme **un détecteur extensible, efficace surtout 
pour les formats binaires ou dotés de signatures nettes**.

Répondre à