L' file
utilitaire détermine le type de fichier de 3 manières:
Premièrement, les tests du système de fichiers : Dans ces tests, un des appels système de la famille stat est appelé sur le fichier. Cela retourne les différents types de fichiers unix : fichier normal, répertoire, lien, périphérique de caractère, périphérique de bloc, canal nommé ou un socket. En fonction de cela, les tests magiques sont effectués.
Les tests magiques sont un peu plus complexes. Les types de fichiers sont définis par une base de données de modèles appelée fichier magique . Certains types de fichiers peuvent être déterminés en lisant un bit ou un nombre à un endroit particulier du fichier (fichiers binaires par exemple). Le fichier magique contient des " nombres magiques " pour tester le fichier, qu'il le contienne ou non, et quelles informations textuelles doivent être imprimées. Ces " nombres magiques " peuvent être des valeurs de 1 à 4 octets, des chaînes, des dates ou même des expressions régulières. Avec d'autres tests, des informations supplémentaires peuvent être trouvées. Dans le cas d’un exécutable, l’information supplémentaire serait de savoir si elle est liée dynamiquement ou non, suppriméeou pas ou l'architecture. Parfois, plusieurs tests doivent réussir avant que le type de fichier puisse être vraiment identifié. Quoi qu'il en soit, le nombre de tests effectués n'a pas d'importance, c'est toujours une bonne idée .
Voici les 8 premiers octets dans un fichier de types de fichiers courants qui peuvent nous aider à avoir une idée de ce à quoi ces chiffres magiques peuvent ressembler:
Hexadecimal ASCII
PNG 89 50 4E 47|0D 0A 1A 0A ‰PNG|....
JPG FF D8 FF E1|1D 16 45 78 ÿØÿá|..Ex
JPG FF D8 FF E0|00 10 4A 46 ÿØÿà|..JF
ZIP 50 4B 03 04|0A 00 00 00 PK..|....
PDF 25 50 44 46|2D 31 2E 35 %PDF|-1.5
Si le type de fichier ne peut pas être trouvé lors de tests magiques, le fichier semble être un fichier texte et file
recherche l'encodage du contenu. Le codage se distingue par les différentes plages et séquences d'octets qui constituent du texte imprimable dans chaque ensemble.
Les sauts de ligne sont également étudiés, en fonction de leurs valeurs HEX:
0A
( \n
) classe un fichier terminé Un * x / Linux / BSD / OSX
0D 0A
( \r\n
) sont des fichiers de systèmes d'exploitation Microsoft
0D
( \r
) serait Mac OS jusqu'à la version 9
15
( \025
) serait IBM AIX
Maintenant, les tests de langue commencent. S'il semble s'agir d'un fichier texte, des chaînes particulières sont recherchées dans le fichier pour déterminer la langue qu'il contient (C, Perl, Bash). Certains langages de script peuvent également être identifiés via hashbang ( #!/bin/interpreter
) dans la première ligne du script.
Si rien ne s'applique au fichier, le type de fichier ne peut pas être déterminé et file
n'imprime que des "données".
Donc, vous voyez qu'il n'y a pas besoin de suffixe. Un suffixe peut de toute façon confondre, s'il est mal défini.