Cours Linux / Identifier le type et les informations d’un fichier avec ls, file et stat
Le nom ou l’extension d’un fichier ne suffit pas à déterminer sa nature. ls -l montre son type dans le système de fichiers, file essaie de reconnaître son format et stat décrit ses métadonnées, comme la taille, les permissions et les horodatages. Ces outils répondent à des questions différentes et leurs résultats doivent être lus ensemble.
Les exemples utilisent Bash, GNU Coreutils et le programme file dans votre Linux de pratique. Une installation minimale peut ne pas fournir file : vérifiez sa disponibilité ou consultez la gestion des paquets de votre distribution. Pour comparer les résultats sans dépendre du contenu d’un fichier système, nous créerons un petit document dont les octets sont connus.
Distinguer type de fichier et format du contenu
Dans Linux, un fichier ordinaire, un répertoire et un lien symbolique correspondent à des types d’objets différents. Une extension comme .txt ou .jpg fait seulement partie du nom. Un fichier texte et une image peuvent tous deux être des fichiers ordinaires du point de vue du système de fichiers.
| Premier caractère de ls -l | Type | Exemple de rôle |
|---|---|---|
| - | Fichier ordinaire | Document, image ou programme |
| d | Répertoire | Entrées permettant d’organiser les noms |
| l | Lien symbolique | Chemin vers une autre entrée |
| c ou b | Périphérique caractère ou bloc | Interfaces de périphériques, notamment sous /dev |
| p ou s | FIFO, ou tube nommé, et socket | Communication entre processus |
Pour voir le type d’un objet répertoire lui-même, utilisez -d. Sans cette option, ls -l appliqué à un répertoire peut lister son contenu. Sur une installation Linux habituelle :
ls -ld -- /etc /etc/passwd
La ligne de /etc commence normalement par d ; celle de /etc/passwd par -. Les valeurs suivantes dépendent de votre installation : permissions, nombre de liens, propriétaire, groupe, taille, date et nom. Ne les recopiez pas comme des valeurs universelles.
Préparer un document dont le contenu est connu
Créez un nouvel espace temporaire et un document sans extension. Le saut de ligne ajouté après abc compte comme un octet dans cet exemple ASCII :
inspection=$(mktemp -d) &&
printf 'abc\n' > "$inspection/document" &&
printf 'Dossier de démonstration : %s\n' "$inspection"
La dernière ligne indique le chemin à conserver pour la suite. Si une erreur survient, ne continuez pas en supposant que le fichier existe. mktemp crée un espace neuf ; le guide de mktemp et des fichiers temporaires explique son emplacement et son cycle de vie.
Dans le même terminal, comparez le répertoire et le document :
test -n "$inspection" &&
ls -ld -- "$inspection" "$inspection/document"
Vous devez retrouver un répertoire et un fichier ordinaire. Le fichier contient exactement quatre octets, abc puis un saut de ligne. L’espace temporaire ne doit pas devenir l’unique emplacement de conservation de données importantes.
Demander à file une estimation du format
file commence par examiner la nature de l’objet et applique ensuite ses règles de reconnaissance du contenu. Son manuel officiel file(1) distingue notamment les tests du système de fichiers, les signatures connues et les tests de texte.
test -n "$inspection" &&
LC_ALL=C file -b -- "$inspection/document"
-b omet le nom dans la sortie et LC_ALL=C fixe la langue de ce seul appel pour faciliter la comparaison. Pour le petit document ASCII de l’exercice, le résultat attendu est :
ASCII text
Il n’a pourtant pas d’extension .txt. Pour vérifier qu’un nom d’image ne transforme pas ces octets en image, copiez-le sous un nom neuf :
test -n "$inspection" &&
cp -- "$inspection/document" "$inspection/photo.jpg" &&
LC_ALL=C file -b -- "$inspection/photo.jpg"
Le contenu reste du texte et file doit encore reconnaître du texte ASCII. La commande cp n’a effectué aucune conversion d’image. Vous avez changé un nom, pas créé une photographie.
La description de file est une classification fondée sur ses règles, sa version et sa base de signatures. Elle peut être incomplète ou erronée ; elle ne certifie ni l’innocuité d’un fichier ni l’absence de contenu malveillant. Une sortie data signifie qu’aucun format plus précis n’a été reconnu par les tests appliqués, pas que le fichier serait nécessairement inutilisable.
Lire les métadonnées avec stat
Les métadonnées décrivent l’objet géré par le système de fichiers plutôt que son texte ou son image. GNU stat présente notamment taille, permissions, propriétaire, inode, nombre de liens et horodatages :
test -n "$inspection" &&
stat -- "$inspection/document"
Un inode est la structure à laquelle sont associées les métadonnées d’un objet. Le nom figure dans une entrée de répertoire qui permet de retrouver cet objet. Un numéro d’inode n’est unique qu’à l’intérieur d’un système de fichiers ; il ne constitue pas une identité mondiale ou un résumé du contenu. Le manuel Linux sur les inodes précise ce périmètre.
Pour afficher une ligne plus courte :
test -n "$inspection" &&
LC_ALL=C stat -c '%F | %s bytes | %n' -- "$inspection/document"
%F indique le type, %s la taille en octets et %n le nom fourni. La ligne commence ici par regular file | 4 bytes |, puis comporte votre chemin réel vers document. Les quatre octets décrivent la longueur logique du contenu, pas nécessairement l’espace alloué sur le support.
Les horodatages n’ont pas tous le même sens :
- Access, ou atime : horodatage d’accès, dont la mise à jour dépend notamment de la politique de montage.
- Modify, ou mtime : horodatage de modification du contenu.
- Change, ou ctime : horodatage de changement d’état de l’inode, mis à jour notamment par des changements de métadonnées et de contenu ; ce n’est pas la création.
- Birth : date de création lorsqu’elle est fournie par le système et l’outil ; elle peut être inconnue.
Le manuel GNU de stat décrit ses formats et leurs valeurs absentes. Ne prenez pas une lecture de date isolée pour un historique exhaustif des opérations effectuées sur un fichier.
Savoir si l’on examine un lien ou sa cible
Un lien symbolique contient un chemin vers une cible. Le lien et la cible sont des objets distincts. Dans le format long de ls, une forme lien → cible peut apparaître ; elle ne garantit pas que la cible existe encore.
Avec GNU stat, le comportement par défaut examine le lien passé en argument, tandis que stat -L suit sa cible. Avec file, -h demande de ne pas suivre le lien et -L demande de le suivre. Ne supposez pas que toutes les commandes appliquent spontanément la même règle.
readlink affiche, dans son mode ordinaire, le chemin enregistré dans le lien. Ce texte peut être relatif : il se résout alors depuis le répertoire contenant le lien, pas depuis le répertoire où vous vous trouvez. Le manuel GNU de readlink distingue cette lecture et ses modes de résolution.
Si la cible manque, l’examen du lien lui-même peut encore réussir alors que son suivi échoue. La lecture du texte stocké ne prouve pas l’existence du fichier visé. Avant de conclure qu’un fichier a disparu ou qu’un lien est vide, vérifiez donc le mode utilisé, le diagnostic et le statut de la commande.
Choisir la commande selon la question
| Question | Outil adapté | Limite |
|---|---|---|
| Est-ce un répertoire, un fichier ordinaire ou un lien ? | ls -l, ou ls -ld pour l’objet lui-même | Le type n’indique pas le format détaillé du contenu |
| À quel format les données ressemblent-elles ? | file | La classification ne constitue pas une certification |
| Quels sont la taille, les droits, les dates et l’inode ? | stat | Les métadonnées ne décrivent pas tout l’historique ni le contenu |
| Quel chemin est enregistré dans un lien symbolique ? | readlink | Le texte peut être relatif et la cible absente |
Dans l’exercice, document et photo.jpg sont tous deux des fichiers ordinaires et contiennent le même texte de quatre octets. Leur extension n’a pas décidé du résultat de file ; stat a fourni une mesure de taille indépendante du nom. Gardez cette séparation lorsque vous examinez des fichiers réels.
Les guides de file et de la reconnaissance des formats, de stat et des métadonnées et de readlink et des cibles de liens approfondissent les options lorsqu’une vérification exige davantage de précision.




