# Systèmes de fichiers

# Système de fichiers

## Notions

Les répertoires sont appelés directories en anglais. Un répertoire est une boîte qui peut contenir des fichiers et d'autres répertoires (comme les catalogues de MS-DOS, ou les dossiers du Macintosh). Des exemples de répertoires :

    /users
    /bin
    /usr/local/bin

On désigne les fichiers (et les répertoires) contenus dans un répertoire par :

    nom de répertoire/nom de fichier

Par exemple : `/bin/sh` est le fichier `sh` contenu dans le répertoire `/bin`.

Les répertoires sont organisés en arbre, c'est-à-dire qu'ils sont tous contenus dans un répertoire appelé la racine, et désigné par "/". Chaque répertoire contient deux répertoires spéciaux :

- `.` désigne le répertoire lui-même.
- `..` désigne le père du répertoire.

Exemples : `/users/92/.` est le même répertoire que `/users/92`, `/users/92/..` est le même répertoire que `/users`.

Chaque utilisateur a un home-directory, ou répertoire personnel. C'est l'endroit ou il range ses fichiers. Sur les machines de la salle S, le répertoire personnel a pour nom `/users/année/groupe/nom-de-login`.

Exemples : `/users/92/maths/vous`, `/users/formel/doligez`.

On peut aussi désigner le répertoire personneld'un autre utilisateur par le nom de login de l'utilisateur précédé d'un tilde (le caractère tilde). Exemple : `~leroy`.

### Noms de fichiers

Un nom de fichier qui commence par `/` est dit absolu. Il est interprété en partant de la racine, et en descendant dans l'arbre. Un nom de fichier qui ne commence pas par `/` est relatif. Il est interprété en partant du répertoire courant. Le répertoire courant est initialement (au moment où vous vous connectez) votre répertoire personnel ; le répertoire courant est le répertoire dans lequel vous vous trouvez.

Exemples : `/users/formel/doligez/foo` est un nom (ou chemin) absolu. `bar` est un nom relatif. Il désigne un fichier appelé `bar` et situé dans le répertoire courant. Le fichier exact dont il s'agit dépend donc de votre répertoire courant.

Remarque : Le seul caractère spécial dans les noms de fichiers est le slash `/`. Un nom de fichier peut avoir jusqu'à 255 caractères, et contenir un nombre quelconque de points.

### Commandes pour manipuler le système de fichiers

#### `pwd`

Affiche le répertoire courant. Exemple :

    chaland ~ $ pwd
    /users/formel/doligez

#### `cd`

Change le répertoire courant. Si on ne lui donne pas d'argument, on retourne dans le répertoire personnel. Exemple :

    chaland ~ $ pwd
    /users/formel/doligez
    chaland ~ $ cd ..
    chaland /users/formel/ $ cd
    chaland ~ $ pwd
    /users/formel/doligez

#### `mkdir`

Crée un nouveau répertoire, (presque) vide. Il ne contient que `.` et `..`.

#### `rmdir`

Supprime un répertoire vide. Si le répertoire contient autre chose que `.` et `..` ça ne marche pas.

#### `mv`

Renomme un fichier, mais peut aussi le déplacer d'un répertoire à un autre. Exemple :

    chaland ~ $ mkdir foo
    chaland ~ $ nano bar
    chaland ~ $ mv bar foo/bar2
    chaland ~ $ cd foo
    chaland ~/foo $ pwd
    /users/formel/doligez/foo
    chaland ~/foo $ ls
    bar2

#### `ls`

Liste les fichiers et les répertoires qu'on lui donne en arguments, ou le répertoire courant si on ne lui donne pas d'argument. `ls` ne liste pas les fichiers dont le nom commence par `.` C'est pourquoi `.` et `..` n'apparaissent pas ci-dessus.

## Raccourcis pour les noms de fichiers

Il est parfois ennuyeux d'avoir à taper un nom complet de fichier comme `nabuchodonosor`. Il est encore plus ennuyeux d'avoir à taper une liste de fichier pour les donner en arguments à une commande, comme : `cc -o foo bar.c gee.c buz.c gog.c`. Pour éviter ces problèmes, on peut utiliser des jokers (wildcards en anglais).

Une étoile `*` dans un nom de fichier est interprétée par le shell comme « n'importe quelle séquence de caractères ». Exemple : `cc -o foo *.c`.

Pour interpréter l'étoile, le shell va faire la liste de tous les noms de fichiers du répertoire courant qui ne commencent pas par `.` et qui finissent par `.c` Ensuite, il remplace `*.c` par cette liste (triée par ordre alphabétique) dans la ligne de commande, et exécute le résultat, c'est-à-dire par exemple : `cc -o foo bar.c buz.c foo.c gee.c gog.c`.

On a aussi le `?`, qui remplace un (et exactement un) caractère quelconque. Par exemple, `*.?` liste tous les fichiers sont l'extension n'a qu'une seule lettre.

La forme `[abcd]` remplace un caractère quelconque parmi `a`, `b`, `c`, `d`. Enfin, `[^abcd]` remplace un caractère quelconque qui ne se trouve pas parmi `a`, `b`, `c`, `d`.

Exemple : `echo /users/*` affiche la même chose que `ls /users` (La commande `echo` se contente d'afficher ses arguments.)

Attention :

- C'est le shell qui fait le remplacement des arguments contenant un joker. On ne peut donc pas faire `mv *.c *.bak`, car le shell va passer à `mv` les arguments `foo.c bar.c foo.bak bar.bak`, et `mv` ne sait pas quel fichier remplacer.
- Attention aux espaces. Si vous tapez `rm * ~`, le shell remplace l'étoile par la liste des fichiers présents, et ils seront tous effacés. Si vous tapez `rm *~`, seuls les fichiers dont le nom finit par un tilde seront effacés.

Interlude : comment effacer un fichier nommé `?*` ? On ne peut pas taper `rm ?*` car le shell remplace `?*` par la liste de tous les fichiers du répertoire courant. On peut taper `rm -i *` qui supprime tous les fichiers, mais en demandant confirmation à chaque fichier. On répond `no` à toutes les questions sauf `rm: remove ?*?`. Autre méthode : utiliser les mécanismes de quotation (voir ci-dessous).

Auteurs : Roberto Di Cosmo, Xavier Leroy; Marc Espie. Mise à jour d'Émilia Robin et de Nicolas George.