Aller au contenu

Système de fichiers

Quand tu enregistres un fichier, tu ne décides pas il est stocké physiquement sur le disque. C’est le système d’exploitation (OS) qui s’en charge. Il joue le rôle d’intermédiaire entre toi (ou tes programmes) et le matériel.

Concrètement, l’OS gère trois responsabilités liées aux fichiers :

L’organisation. L’OS maintient une arborescence de dossiers et de fichiers. Quand tu tapes ls ou que tu ouvres l’explorateur de fichiers, c’est l’OS qui te présente cette structure — le disque dur, lui, ne connaît que des blocs de données numérotés.

L’accès. L’OS contrôle qui a le droit de lire, modifier ou exécuter chaque fichier. Sans ce contrôle, n’importe quel programme pourrait modifier n’importe quel fichier du système.

Le stockage. L’OS décide comment les données sont réparties sur le disque, gère l’espace libre, et s’assure qu’un fichier supprimé libère bien son espace. Un fichier de 50 Mo peut être dispersé en dizaines de fragments sur le disque — l’OS te le présente comme un tout cohérent.

Pour organiser les données sur un disque, l’OS utilise un système de fichiers (filesystem). C’est le format qui définit comment les fichiers, les dossiers, les permissions et les métadonnées sont structurés sur le support de stockage.

Chaque OS a ses préférences :

Système de fichiersOS principalCaractéristiques
ext4LinuxLe standard Linux actuel. Gère les permissions Unix, les liens symboliques, et supporte des fichiers très volumineux.
NTFSWindowsLe standard Windows. Gère les permissions Windows (ACL), le chiffrement et la compression.
APFSmacOSLe standard Apple moderne. Optimisé pour les disques SSD, avec snapshots et clonage rapide de fichiers.
FAT32UniverselAncien mais compatible partout. Limité à 4 Go par fichier. Utilisé sur les clés USB.
exFATUniverselSuccesseur de FAT32 sans la limite de 4 Go. Courant sur les cartes SD et disques externes.

En développement web, tu travailleras presque toujours sur ext4 (serveurs Linux) ou APFS/NTFS (ta machine locale). La différence la plus visible au quotidien : Linux distingue les majuscules et les minuscules dans les noms de fichiers (Style.css et style.css sont deux fichiers différents), alors que Windows et macOS ne les distinguent pas par défaut.


Sous Linux, un fichier n’est pas juste son contenu. L’OS conserve un ensemble de métadonnées — des informations sur le fichier — qui permettent de l’identifier, de le protéger et de le gérer.

Le nom d’un fichier sous Linux peut contenir presque n’importe quel caractère, mais en pratique on suit des conventions :

  • Pas d’espaces. On utilise des tirets (mon-fichier.txt) ou des tirets bas (mon_fichier.txt).
  • Pas de caractères spéciaux. Éviter & * ? ! @ # $ et les accents dans les noms de fichiers — ils compliquent les commandes et causent des problèmes de portabilité.
  • La casse compte. index.html, Index.html et INDEX.HTML sont trois fichiers différents sous Linux.
  • L’extension n’est pas magique. Sous Linux, l’extension (.html, .css, .js) est une convention pour les humains. Le système ne s’en sert pas pour déterminer le type du fichier — contrairement à Windows qui associe les extensions à des programmes.

Chaque fichier a un emplacement unique dans l’arborescence, exprimé par son chemin absolu :

/home/labex/projet-web/css/style.css

Ce chemin se décompose ainsi :

SegmentRôle
/La racine du système
home/Dossier contenant les dossiers personnels
labex/Ton dossier personnel
projet-web/Un dossier de projet
css/Un sous-dossier
style.cssLe fichier

Deux fichiers peuvent avoir le même nom s’ils sont dans des dossiers différents. C’est le chemin complet qui les distingue.

La commande ls -l affiche un caractère au tout début de chaque ligne qui indique le type :

CaractèreTypeDescription
-Fichier ordinaireUn fichier contenant des données (texte, image, code…)
dDossier (directory)Un conteneur pour d’autres fichiers et dossiers
lLien symboliqueUn raccourci vers un autre fichier ou dossier

Il existe d’autres types (fichiers spéciaux, sockets, etc.), mais ces trois sont ceux que tu rencontreras au quotidien.

La taille d’un fichier est exprimée en octets. Pour la rendre lisible, on peut utiliser :

Fenêtre de terminal
ls -lh

L’option -h (human-readable) convertit les tailles en Ko, Mo, Go :

-rw-r--r-- 1 labex labex 2.4K mars 22 10:30 style.css
-rw-r--r-- 1 labex labex 1.1M mars 22 10:31 image.png

Linux enregistre trois dates pour chaque fichier :

DateSignificationAffichée par
Modification (mtime)Dernière modification du contenuls -l (par défaut)
Accès (atime)Dernière lecture du fichierls -lu
Changement (ctime)Dernier changement des métadonnées (permissions, nom…)ls -lc

En pratique, c’est la date de modification qui t’intéresse le plus souvent.


Dans Linux, un dossier est lui-même un type particulier de fichier. Pour le système de fichiers, il n’existe pas de séparation fondamentale entre « fichier » et « dossier » : ce sont des objets ayant des rôles différents dans l’organisation des données.

En interne, le système associe chaque fichier et chaque dossier à une structure appelée inode. L’inode contient toutes les métadonnées d’une ressource : type, taille, permissions, dates, emplacement sur le disque. Le nom du fichier, lui, n’est pas dans l’inode — il est stocké dans le dossier parent.

Un dossier est donc essentiellement un fichier spécial qui contient une liste de noms associés à des inodes.


Quand tu tapes ls -l, chaque ligne affiche une quantité dense d’information. Voici comment la décoder.

Fenêtre de terminal
ls -l
drwxr-xr-x 2 labex labex 4096 mars 22 08:00 css
-rw-r--r-- 1 labex labex 245 mars 22 10:30 index.html
lrwxrwxrwx 1 labex labex 9 mars 22 11:00 styles -> css/style.css

Prenons la deuxième ligne :

-rw-r--r-- 1 labex labex 245 mars 22 10:30 index.html
SegmentValeurSignification
Type-Fichier ordinaire
Permissions propriétairerw-Lecture + écriture
Permissions grouper--Lecture seule
Permissions autresr--Lecture seule
Nombre de liens1Un seul lien pointe vers l’inode de ce fichier
PropriétairelabexL’utilisateur qui possède le fichier
GroupelabexLe groupe associé au fichier
Taille245245 octets
Datemars 22 10:30Dernière modification
Nomindex.htmlLe nom du fichier

Sous Linux, tout fichier ou dossier dont le nom commence par un point (.) est caché. Il n’apparaît pas avec ls, seulement avec ls -a.

Fenêtre de terminal
ls -a
. .. .git .env .gitignore index.html css/

Les fichiers cachés courants en développement web :

FichierRôle
.git/Dossier de versionnement Git
.gitignoreListe des fichiers à exclure de Git
.envVariables d’environnement (clés API, mots de passe)
.vscode/Configuration de l’éditeur VS Code
.prettierrcConfiguration du formateur de code
.eslintrcConfiguration du linter JavaScript
node_modules/(Pas caché mais souvent dans .gitignore)

L’arborescence Linux peut contenir des milliers de dossiers. Au quotidien, tu te déplaces dans cette structure avec quelques commandes de base.

Fenêtre de terminal
pwd # où suis-je ?
cd dossier # entrer dans un dossier
cd .. # remonter d'un niveau
cd ~ # retourner au dossier personnel
cd / # aller à la racine

Deux façons de décrire un emplacement :

Chemin relatifChemin absolu
Point de départLe dossier courantLa racine /
Exemplecd ../jscd /home/labex/projet/js
AvantageCourt à écrireFonctionne de n’importe où

En pratique, on utilise les chemins relatifs pour les déplacements courts (« le dossier juste à côté ») et les chemins absolus quand on doit accéder à un emplacement précis sans ambiguïté.

Dans un projet réel, les chemins peuvent devenir longs et répétitifs :

Fenêtre de terminal
cd /var/www/mon-application/shared/assets/images
cd /home/labex/projets/client-xyz/frontend/src/components

Taper ces chemins régulièrement est fastidieux et source d’erreurs. C’est ici que les liens symboliques deviennent utiles.

Un lien symbolique (symlink) est un fichier spécial qui pointe vers un autre fichier ou dossier. C’est un raccourci intégré au système de fichiers — les programmes qui ouvrent le lien accèdent directement à la cible.

Fenêtre de terminal
ln -s cible nom-du-lien

Par exemple, au lieu de taper le chemin complet à chaque fois :

Fenêtre de terminal
# Créer un raccourci vers un dossier profondément imbriqué
ln -s /var/www/mon-application/shared/assets/images ~/images-app
# Maintenant, pour y accéder :
cd ~/images-app

Avec ls -l, un lien symbolique est identifiable par le l au début et la flèche -> :

lrwxrwxrwx 1 labex labex 45 mars 22 11:00 images-app -> /var/www/mon-application/shared/assets/images
Fenêtre de terminal
rm mon-lien

Supprimer un lien ne supprime pas la cible. Seul le raccourci est retiré.

Quand tu installes un outil comme eslint ou vite avec npm, le binaire exécutable est placé dans node_modules/.bin/ sous forme de lien symbolique :

node_modules/.bin/vite -> ../vite/bin/vite.js

C’est ce qui permet à npx vite de fonctionner sans installer l’outil globalement.

Sur un serveur Linux avec Nginx, les sites disponibles et les sites actifs sont gérés par des symlinks :

Fenêtre de terminal
# Activer un site
ln -s /etc/nginx/sites-available/mon-site.conf /etc/nginx/sites-enabled/
# Désactiver un site (supprime le lien, pas la configuration)
rm /etc/nginx/sites-enabled/mon-site.conf

La configuration reste dans sites-available/. Le lien dans sites-enabled/ dit à Nginx « ce site est actif ». Pour désactiver un site, on supprime le lien — la configuration est préservée.