# Système de fichiers

## Tout est fichier

Sous Linux, tout est fichier:

- les fichiers (évidemment)
- les répertoires
- d'autres choses plus avancées (*socket*, *devices*, ...)

Dans la suite, nous distinguerons les fichiers des répertoires.

## Fichiers cachés

Par défaut, `ls` affiche tous les fichiers visibles.

```bash
$ ls
Documents  examples.desktop  Modèles  Téléchargements  Vidéos
Bureau     Images            Musique  Public  snap
```

Les fichiers cachés sont ceux dont le nom commence par un point `.`.  
Même s'ils sont présent dans le répertoire, `ls` ne les affiche pas.  

Par exemple: `.bashrc`

```bash
$ ls .bashrc
.bashrc
```

L'option `-a` (pour *all*) de `ls` permet d'afficher aussi les fichiers cachés.

```bash
$ ls -a
.          Documents  examples.desktop      Modèles  Téléchargements
..         Vidéos     Bureau     Images     Musique  Public
.bashrc    snap
```

## Chemins relatifs

`ls -a` commence par afficher les « fichiers » `.` et `..`.  
Ils représentent respectivement le répertoire courant (`.`) et son répertoire
parent (`..`).

Ainsi, si vous voulez connaître les fichiers contenus dans le répertoire parent,
vous pouvez utiliser le *chemin relatif* `..`.

```bash
$ ls ..
parmentf
houdry
```

En l'occurrence, et en supposant qu'on se trouve dans le répertoire par défaut
(aussi appelé *home directory*), l'appel à `ls ..` montre les répertoires par
défaut de tous les utilisateurs de l'ordinateur.

De même, `ls .` est strictement équivalent à `ls`, il liste les fichiers du
répertoire courant.

Mais on peut composer un chemin en joignant des noms de répertoires avec le
caractère `/`.

> 📗 À noter: sous Windows, le caractère correspondant est `\`.

Au minimum `ls ./` est strictement équivalent à `ls .` et donc à `ls`.

Mais on peut aller plus loin en faisant `ls ./Documents`, voire `ls
./Documents/Unix`.

Comme `..` est un chemin relatif, on peut aussi l'utiliser.  
Par exemple `ls ../houdry/Documents` permet de lister les fichiers du répertoire
`Documents` de l'utilisateur Unix `houdry`.

> 💡 Les chemins relatifs sont utilisables comme paramètres de toutes les
> commandes attendant un chemin de fichier (typiquement `cat`, `cp`, `mv`, `rm`,
> ...)
>
> 💡 Les chemins relatifs évitent d'avoir à utiliser la commande `cd` pour se
> mettre dans le répertoire où se trouve le(s) fichier(s) à utiliser.

## Chemins absolus

Un chemin absolu est un chemin qui précise la localisation d'un fichier depuis
la racine de l'arborescence des fichiers.  

Il commence obligatoirement par le caractère `/`.

> ⚠️ Tout chemin de fichier commençant par un caractère différent de `/`
> est un chemin relatif !  
> Il est relatif au répertoire courant.

Sur un système Ubuntu (distribution Linux très répandue), voici les répertoires
présents à la racine.

```bash
$ ls /
bin    dev   initrd.img      lib64       mnt   root  snap  tmp  vmlinuz
boot   etc   initrd.img.old  lost+found  opt   run   srv   usr  vmlinuz.old
cdrom  home  lib             media       proc  sbin  sys   var
```

Ces répertoires peuvent varier selon les distributions, mais globalement:

- `bin`: contient des binaires (des exécutables, dont la plupart des commandes déjà citées)
- `cdrom`: permet d'accéder éventuellement à un CD-ROM dans son lecteur
- `etc`: des fichiers liés aux applications du système (configuration)
- `lib`: des bibliothèques logicielles diverses
- `proc`: des fichiers dynamiques liés à l'exécution du système (essayer `cat /proc/uptime`)
- `home`: les répertoires par défaut des utilisateurs du système
- `opt`: des logiciels alternatifs
- `sbin`: des commandes système
- `tmp`: fichiers temporaires (nettoyé à chaque démarrage)
- `var`: données liées à certains logiciels

`pwd` donne le chemin courant *absolu*:

```bash
$ pwd
/home/parmentf
```

Ainsi le répertoire `./Documents` à partir du répertoire par défaut de
`parmentf` a pour chemin absolu `/home/parmentf/Documents`.  
L'avantage est qu'il univoque, alors qu'un chemin relatif dépend entièrement du
répertoire où on se trouve quand on l'utilise.
