Définition

Un système de fichiers / FileSystem / FS: comment dont sont gérés et organisés les fichiers par le système d’exploitation. Le FS d’Unix est hiérarchique.

Les divers types de fichiers

On distingue principalement trois types de fichiers : ordinaires, catalogue, spéciaux.

Fichiers ordinaires (ordinary files)

Ce sont soit des fichiers contenant du texte, soit des exécutables (ou binaires), soit des fichiers de données. Par défaut, rien ne permet de différencier les uns des autres, sauf à utiliser quelques options de certaines commandes (ls -F par exemple) ou la commande file.

$ file nom_fic
nom fic : 32 Bits ELF Executable Binary (stripped)

Catalogues (les répertoires ou directory)

Les répertoires permettent d’organiser le disque dur en créant une hiérarchie. Un répertoire peut contenir des fichiers normaux, des fichiers spéciaux et d’autres répertoires, de manière récursive.

Fichiers spéciaux

Ce sont le bien souvent des fichiers servant d’interface pour les divers périphériques. Ils peuvent s’utiliser, suivant le cas, comme des fichiers normaux. Un accès en lecture ou écriture sur ces fichiers est directement dirigé vers le périphérique en passant par le pilote Unix associé s’il existe

Nomenclature des fichiers

On ne peut pas donner n’importe quel nom à un fichier, il faut pour cela suivre quelques règles simples. Ces règles sont valables pour tous les types de fichiers.

Sur les anciens systèmes un nom de fichier ne peut pas dépasser 14 caractères. Sur les systèmes récents, on peut aller jusqu’à 255 caractères. Il est possible d’utiliser des extensions de fichiers mais cela ne modifie en rien le comportement du système (un exécutable n’a pas besoin d’une extension particulière).

Unix fait la distinction entre les minuscules et majuscules. Toto, TOTO, ToTo et toto sont des noms de fichiers différents.

La plupart des caractères (chiffres, lettres, majuscules, minuscules, certains signes, caractères accentués) sont acceptés, y compris l’espace (très déconseillé). Cependant quelques caractères sont à éviter :

- & ; ( ) ~ <espace> \ | ` ? - (en début de nom)

Quelques noms valides :

Fichier1
Paie.txt
123traitement.sh
Paie_juin_2002.xls
8
...

Quelques noms pouvant poser problème :

Fichier*
Paie(decembre)
Ben&Nuts
Paie juin 2002.xls
-f
...

Chemins

Structure et nom de chemin

Les chemins permettent de se déplacer dans le FileSystem. Un nom de fichier est ainsi généralement complété de son chemin d’accès. C’est ce qui fait que le fichier « toto » du répertoire « rep1 » est différent du fichier « toto » du répertoire « rep2 ». Le FS d’Unix étant hiérarchique, il décrit une arborescence.

%%{init: {'theme':'default'}}%% flowchart TD id1(( / )) --- id2((bin)) id1(( / )) --- id3((sbin)) id1(( / )) --- id4((usr)) id1(( / )) --- id5((etc)) id1(( / )) --- id6((lib)) id1(( / )) --- id7((dev)) id1(( / )) --- id8((home)) id1(( / )) --- id9((tmp)) id4((usr)) --- id10((bin)) id4((usr)) --- id11((lib)) id4((usr)) --- id12((src)) id8((home)) --- id13((franck)) id8((home)) --- id14((eric)) id13((franck)) --- id15((Perso)) id13((franck)) --- id16((Docs)) id16((Docs)) --- id17((Backup))

Le schéma précédent représente une arborescence d’un FS Unix. Le « / » situé tout en haut s’appelle la racine ou root directory (à ne pas confondre avec le répertoire de l’utilisateur root).

Le nom de chemin ou path name d’un fichier est la concaténation, depuis la racine, de tous les répertoires qu’il est nécessaire de traverser pour y accéder, chacun étant séparé par le caractère « / ». C’est un chemin absolu.
/home/toto/Docs/Backup/fic.bak

Chemin relatif

Un nom de chemin peut aussi être relatif à sa position courante dans le répertoire.

Le système (ou le shell) mémorise la position actuelle d’un utilisateur dans le système de fichier, le répertoire actif. On peut donc accéder à un autre répertoire de l’arborescence depuis l’emplacement actuel sans taper le chemin complet.

Pour se déplacer dans les répertoires, on utilise la commande cd. Le « .. » permet d’accéder au répertoire de niveau supérieur. Le « . » définit le répertoire actif (répertoire courant). La commande ls permet de lister le contenu du répertoire. La commande pwd (printworkingdirectory) affiche le chemin complet du répertoire actif.

$ cd /
$ ls
bin
sbin
usr
etc
lib
dev
home
tmp
$ cd /usr/lib
$ pwd
/usr/lib
$ cd ../bin
$ pwd
/usr/bin
$ cd ../../etc
$ pwd
/etc

Répertoire personnel

Lors de la création d’un utilisateur, l’administrateur lui alloue un répertoire utilisateur. Après une connexion, l’utilisateur arrive directement dans ce répertoire, qui est son répertoire personnel. C’est dans ce répertoire que l’utilisateur pourra créer ses propres fichiers et répertoires. La commande cd sans argument permet de retourner directement dans son répertoire utilisateur.

Login : toto
Password :
$ pwd
/home/toto

ls et quelques commandes intéressantes

La commande ls permet de lister le contenu d’un répertoire (catalogue) en lignes ou colonnes. Elle supporte plusieurs options.

Option Signification
-l Sortie de chaque information des fichiers
-F Ajoute un « / » au nom d’un répertoire, un « * » au nom d’un exécutable, un «
-a Affiche toutes les entrées, y compris « . », « .. » et les fichiers cachés (qui commencent par un .)
-d affiche le nom (et les attributs) des répertoires et pas leur contenu.
-i Affiche les numéros d’inode.
-R Mode récursif. Rentre dans les répertoires et affiche leur contenu.
-r Inverse l’ordre du tri (à l’envers)
-t Tri par date de modification
-c Affiche la date de création (si -l) ou tri par date de création (si -t)
-C Les noms sont affichés sur plusieurs colonnes
-u Affiche la date d’accès (-l) ou tri par date d’accès (-t)
-1 Liste sur une seule colonne.

Sortie de la commande ls -l :

-rw-r–r– 1 oracle dba 466 Feb 8 2001 input.log
1 2 3 4 5 6 7
  1. Le 1er caractère représente le type de fichier, les autres, par blocs de trois, les droits pour l’utilisateur, le groupe et tous (expliqué plus loin).
  2. Compteur de liens (expliqué plus loin)
  3. Propriétaire du fichier.
  4. Groupe auquel appartient :le fichier
  5. Taille du fichier en octets
  6. Date de dernière modification (parfois avec l’heure)
  7. Nom du fichier

Deux autres commandes utiles :

  • cat : concaténation de fichiers, le résultat étant affiché par défaut sur la sortie standard (écran)
  • touch : permet de créer un fichier s’il n’existe pas, et s’il existe de modifier sa date d’accès et sa date de modification, touch toto crée le fichier toto s’il n’existe pas

Gestion des fichiers et répertoires

Création de répertoires

La commande mkdir (make directory) permet de créer un ou plusieurs répertoires, ou une arborescence complète.

mkdir rep1 [rep2] ... [repn]

Typiquement :

$ mkdir documents
$ mkdir documents/texte documents/calcul documents/images

La commande mkdir accepte un paramètre « -p » permettant de créer une arborescence. Dans l’exemple précédent, si je veux créer documents/texte et que documents n’existe pas, alors :

$ mkdir -p documents/texte

va créer à la fois documents et texte. C’est valable pour tous les répertoires de niveau supérieur :

$ mkdir -p documents/texte/perso

va créer les répertoires documents, texte et perso s’ils n’existent pas. S’il existent ils ne sont pas modifiés.

Suppression de répertoires

La commande rmdir (remove directory) supprime un ou plusieurs répertoires. Elle ne supprime pas une arborescence. Si des fichiers sont encore présents dans le répertoire, la commande retourne une erreur. Le répertoire ne doit donc contenir ni fichiers ni répertoires.

rmdir rep1 [rep2] ... [repn]

Typiquement :

$ cd documents
$ rmdir texte/perso

Copie de fichiers

La commande cp (copy) copie un ou plusieurs fichiers vers un autre fichier ou vers un répertoire.

cp fic1 fic2
cp fic1 [fic2 ... ficn] rep1

Dans le premier cas, fic1 est recopié en fic2. Si fic2 existe, il est écrasé sans avertissement (sauf droit particulier). Dans le second cas, fic1, fic2 et ainsi de suite sont recopiés dans le répertoire rep1. Les chemins peuvent êtres absolus ou relatifs. La commande peut prendre les options suivantes :

  • -i : demande une confirmation pour chaque fichier avant d’écraser un fichier existant.
  • -p : préservation des permissions, dates d’accès de modification
  • -r : Récursif. Si la source est un répertoire copie de ce répertoire et de toute son arborescence. Les liens symboliques (voir plus loin) ne sont pas recopiés tels quels, mais seulement les fichiers pointés (avec le nom du lien cependant).
  • -R : comme -r mais la recopie est identique à l’original (les liens symboliques sont copiés tels quels)
$ cd
$ pwd
/home/toto
$ touch cv.txt calc.xls image.jpg
$ ls
cv.txt calc.xls image.jpg documents
$ cp cv.txt documents/texte
$ cp calc.xls documents/calcul/calcul\_paie.xls
$ cd documents
$ touch fichier
$ cp fichier ..
$ cp texte/cv.txt .

Déplacer et renommer un fichier

La commande mv (move) permet de déplacer et/ou de renommer un fichier. Elle a la même syntaxe que la commande cp. On peut à la fois déplacer et changer de nom.

$ cd
$ mv cv.txt cv_toto.txt
$ mv image.jpg documents/images/photo_toto_cv.jpg

Supprimer un fichier ou une arborescence

La commande rm (remove) supprime un ou plusieurs fichiers, et éventuellement une arborescence complète, suivant les options. La suppression est définitive (à moins d’avoir un utilitaire système propre au filesystem).

rm [Options] fic1 [fic2...]

Options :

  • -i : la commande demandera une confirmation pour chacun des fichiers à supprimer. Suivant la version d’Unix, le message change et la réponse aussi : y, Y, O, o, N, n, parfois toutes.
  • -r : le paramètre suivant attendu est un répertoire. Dans ce cas, la suppression est récursive : tous les niveaux inférieurs sont supprimés, les répertoires comme les fichiers.
  • -f : force la suppression. Si vous n’êtes pas le propriétaire du fichier à supprimer, rm demande une confirmation, mais pas avec l’option -f. Aucun message n’apparaîtra si la suppression n’a pu avoir lieu.
$ cd
$ rm -rf documents

Les liens : plusieurs noms pour un fichier

Un lien permet de donner plusieurs noms à un même fichier, ou de faire pointer un fichier sur un autre. Plutôt que de faire plusieurs copies d’un même fichier pour plusieurs utilisateurs, on peut par exemple permettre à ceux-ci d’accéder à une copie unique, mais depuis des endroits et des noms différents. On utilise la commande ln.

ln [options] fic1 fic2
ln [options] fic1 rep1
ln [options] rep1 fic2

Il existe deux types de liens : les liens en dur « hard links » et les liens symboliques « ** **** symbolic **** links **».

Un hard link permet d’ajouter une référence sur un inode.

Sous Unix chaque fichier est en fait référencé au sein de deux tables : une table d’inode (information node, noeud d’information, une par filesystem) qui contient outre un numéro de fichier, des informations comme des droits, le type et des pointeurs sur données, et une table catalogue (une par répertoire) qui est une table de correspondance entre les noms de fichiers et les numéros d’inodes. Le hard link rajoute donc une association dans cette seconde table entre un nom et un inode. Les droits du fichier ne sont pas modifiés.

Un hard link ne permet pas d’affecter plusieurs nom à un même répertoire, et ne permet pas d’effectuer des liens depuis ou vers un autre filesystem. De plus, faites attention au compteur de lien fourni par la commande ls -l : un 1 indique que ce fichier ne possède pas d’autres liens, autrement dit c’est le dernier. Si vous le supprimez, il est définitivement perdu. Par contre, tant que ce compteur est supérieur à 1, si un lien est supprimé, il reste une copie du fichier quelque part.

$ cd
$ touch fic1
$ ln ficr1 fic2
$ ls
fic1 fic2
$ ls -l
-rw-r--r-- 2 oracle system 0 Jul 25 11:59 fic1
-rw-r--r-- 2 oracle system 0 Jul 25 11:59 fic2
$ ls -i
  484 fic1 484 fic2

L’exemple précédent montre que les hard links n’ont pas de type particulier et sont considérés comme des fichiers ordinaires. On constate que chacun a 2 liens. Logique puisque deux fichiers pointent sur le même inode. Enfin nous voyons bien en résultat du ls -i que fic1 et fic2 ont le même inode, à savoir 484.

Un lien symbolique ne rajoute pas une entrée dans la table catalogue mais est en fait une sorte d’alias, un fichier spécial contenant une donnée pointant vers un autre chemin (on peut le concevoir comme une sorte de fichier texte spécial contenant un lien vers un autre fichier ou répertoire).

De par cette nature, un lien symbolique ne possède pas les limitations du hard link. Il est donc possible d’effectuer des liens entre plusieurs FileSystems, et vers des répertoires. Le cas échéant le lien se comportera à l’identique du fichier ou du répertoire pointés (un cd nom_lien est possible dans le cas d’un répertoire).

La suppression de tous les liens symboliques n’entraîne que la suppression de ces liens, pas du fichier pointé. La suppression du fichier pointé n’entraîne pas la suppression des liens symboliques associés. Dans le cas le lien pointe dans le vide.

$ rm fic2
$ ln -s fic1 fic2
$ ls -l
-rw-r--r-- 1 oracle system 0 Jul 25 11:59 fic1
lrwxrwxrwx 1 oracle system 4 Jul 25 12:03 fic2 -\> fic1
$ ls -i
  484 fic1 635 fic2
$ ls -F
fic1 fic2@

Cet exemple montre bien qu’un lien symbolique est en fait un fichier spécial de type « l » pointant vers un autre fichier. Attention, les droits indiqués sont ceux du fichier spécial. Lors de sont utilisation, ce sont les droits du fichier ou du dossiers pointés qui prennent le dessus. On distingue le caractère « @ » indiquant qu’il s’agit d’un lien symbolique. On remarque aussi que les inodes sont différents et que les compteurs sont tous à 1.

Critères de recherche sur noms de fichier

Lors de l’utilisation de commandes en rapport avec le système de fichier, il peut devenir intéressant de filtrer la sortie de noms de fichiers à l’aide de certains critères, par exemple avec la commande ls. Au lieu d’afficher toute la liste des fichiers, on peut filtrer l’affichage à l’aide de divers critères et caractères spéciaux.

Caractère spécial Rôle
\* Remplace une chaîne de longueur variable, même vide
? Remplace un caractère unique quelconque
[] Une série ou une plage de caractères
[!...] Inversion de la recherche

Ainsi,

  • ls a* : tous les fichiers commençant par a
  • ls a?? : tous les fichiers de trois caractères commençant par a
  • ls a??* : tous les fichiers d’au moins trois caractères et commençant par a
  • ls [aA]* : tous les fichiers començant par a ou A
  • ls [a-m]?*txt : tous les fichiers commençant par les lettres de a à m, possédant au moins un second caractère avant la terminaison txt.

C’est le shell qui est chargé d’effectuer la substitution de ces caractères avant le passage des paramètres à une commande. Ainsi lors d’un…

cp \* documents

cp ne reçoit pas le caractère * mais la liste de tous les fichiers et répertoires du répertoire actif.

Verrouillage de caractères

Certains caractères spéciaux doivent être verrouillés, par exemple en cas de caractères peu courants dans un nom de fichier.

Le backslash \ permet de verrouiller un caractère unique.

$ ls paie\ \*.xls

Cette commande va lister tous les fichiers contenant un espace après paie.

Les guillemets “…” les guillemets permettent l’interprétation des caractères spéciaux, variables, au sein d’une chaîne.

Les apostrophes ‘…’ verrouillent tous les caractères spéciaux dans une chaîne ou un fichier.

Photo de Garmin B sur Unsplash