Lors de l'utilisation d'un terminal, il est important de savoir où l'on se situe dans la hiérarchie. Si nous voulons jouer à un jeu, nous savons que nous voulons aller dans le répertoire Jeux, où se trouve notre jeu préféré, Warcraft3. Pour accéder au répertoire Games, nous devons savoir où nous nous trouvons, puis naviguer dans le système de fichiers pour y arriver.
Une hiérarchie de fichiers et de répertoires est une structure pour les organiser. La structure hiérarchique permet de les regrouper dans des répertoires, qui à leur tour contiennent d'autres répertoires ou fichiers. De cette façon, nous ne pouvons travailler qu'avec un sous-ensemble de fichiers et de répertoires sur le total du système.
Un tel exemple est le suivant :
Sous Linux, le début de cette hiérarchie est /, le répertoire racine du système de fichiers. Si nous considérons le système de fichiers comme un arbre inversé, le répertoire racine est la racine même de cet arbre. À partir de là, les branches et les feuilles du système de fichiers se développent, formant ce que nous appellerons des chemins.
Nous pouvons voir le début de la hiérarchie Linux ci-dessous :
student@uso:/$ tree -F -L 1 / / |-- bin/ |-- boot/ |-- dev/ |-- etc/ |-- home/ |-- initrd.img -> /boot/initrd.img-3.16.0-4-586 |-- lib/ |-- lib64/ |-- libx32/ |-- lost+found/ |-- media/ |-- mnt/ |-- opt/ |-- proc/ |-- root/ |-- run/ |-- sbin/ |-- srv/ |-- sys/ |-- tmp/ |-- usr/ |-- var/ ``-- vmlinuz -> boot/vmlinuz-3.16.0-4-586
On remarque / (le répertoire racine) au début de la hiérarchie. Au niveau suivant, c'est-à-dire les branches / enfants du répertoire racine, se trouvent les répertoires bin, boot, dev, etc.
On observe le contenu du répertoire home :
student@uso:/home$ tree -F -L 1 /home . ``-- student/
Il n'y a qu'un seul directeur, appelé student. Ensuite, nous détaillons le concept de chemin.
Nous partons de l'analogie suivante : Nous avons quatre points sur une droite : A, B, C et D. Pour aller de A à D, nous devons passer par B et C. Ainsi, nous avons les segments suivants : AB, BC , CD.
De même, pour le système de fichiers, nous commençons au répertoire racine (/) et descendons dans l'arborescence.
La liste des répertoires intermédiaires depuis la racine de la hiérarchie des fichiers (/) jusqu'à un fichier ou un répertoire particulier est appelée chemin.
Le chemin actuel est notre position dans le système de fichiers.
Dans la ligne de commande, nous affichons le chemin d'accès au répertoire dans lequel nous nous trouvons (chemin actuel) à l'aide de la commande pwd (print working directory) :
student@uso:~$ pwd /home/student
Cela montre notre position dans le système de fichiers.
Nous passons au chemin /usr/bin en utilisant la commande cd (change directory) :
student@uso:~$ pwd /home/student student@uso:~$ cd /usr/bin/ student@uso:/usr/bin$ pwd /usr/bin
Nous sommes maintenant à la position /usr/bin dans le système de fichiers. Nous remarquons comment le chemin actuel change lorsque nous changeons le répertoire dans lequel nous nous trouvons.
Lorsque nous voulons lire, écrire, supprimer un fichier ou un répertoire, nous devons nous référer à ce fichier ou répertoire. Pratiquement toutes les opérations du système de fichiers (archiver, chiffrer, supprimer, modifier) utilisent des chemins. Il est incorrect de dire “ouvrez le fichier /home/student/a.txt” ; techniquement correct est “ouvrez le fichier à partir du chemin /home/student/a.txt”.
Dans le système de fichiers, nous pouvons faire référence à un fichier de 2 manières : en utilisant le chemin relatif ou en utilisant le chemin absolu.
Prenons par exemple une série sur Netflix. Nous nous référons à un épisode de deux manières :
De même, nous nous référons à un fichier :
Comme indiqué ci-dessus, le chemin absolu commence toujours par le caractère / (barre oblique), également appelé répertoire racine. Ceci indique le début de la hiérarchie des fichiers.
On liste les fichiers /usr/bin/touch et /etc/passwd par chemin absolu en utilisant ls :
student@uso:~$ ls -l /usr/bin/touch lrwxrwxrwx 1 root root 10 Mar 14 2015 /usr/bin/touch -> /bin/touch student@uso:~$ ls -l /etc/passwd -rw-r--r-- 1 root root 1768 Sep 9 14:07 /etc/passwd
On a utilisé l'option -l de l'utilitaire ls pour afficher des informations supplémentaires sur les fichiers.
On remarque qu'au début des chemins il y a toujours le caractère '/' (le répertoire racine).
Par chemin relatif, nous entendons un fichier relatif au chemin courant.
student@uso:~$ ls -l uso.git/lab02/ total 12 drwxr-xr-x 5 student student 4096 aug 20 2018 anul_1 drwxr-xr-x 2 student student 4096 aug 20 2018 anul_2 drwxr-xr-x 4 student student 4096 aug 20 2018 demo
Dans l'exemple ci-dessus, nous sommes au chemin /home/student et avons descendu la hiérarchie des fichiers vers le répertoire uso.git, puis le répertoire lab02.
Nous obtenons le même résultat en utilisant le chemin absolu :
student@uso:~$ ls -l /home/student/uso.git/lab02/ total 12 drwxr-xr-x 5 student student 4096 aug 20 2018 anul_1 drwxr-xr-x 2 student student 4096 aug 20 2018 anul_2 drwxr-xr-x 4 student student 4096 aug 20 2018 demo
Le chemin /home/student/uso.git/lab02/ est valide quel que soit le chemin courant (où que nous soyons dans la hiérarchie des fichiers).
Dans ce cas, il est plus efficace d'utiliser le chemin relatif. Si nous pouvons passer plus rapidement du répertoire racine / au répertoire cible, le chemin absolu est plus utile.
Nous référençons les mêmes fichiers (/usr/bin/touch et /etc/passwd) par chemin relatif, en utilisant ls :
student@uso:~$ pwd /home/student student@uso:~$ ls -l ../../usr/bin/touch lrwxrwxrwx 1 root root 10 Mar 14 2015 ../../usr/bin/touch -> /bin/touch student@uso:~$ ls -l ../../etc/passwd -rw-r--r-- 1 root root 1768 Sep 9 14:07 ../../etc/passwd
On s'aperçoit qu'on est au chemin /home/student et on monte tout en haut de la hiérarchie des fichiers à l'aide des caractères …
Une fois que nous atteignons le répertoire racine /, nous descendons dans le fichier touch, en passant par les répertoires usr et bin.
Nous placer dans un répertoire autre que celui en cours signifie changer le chemin en cours. Pour ce faire, utilisez la commande cd (changer de répertoire) :
student@uso:/etc$ pwd /etc student@uso:/etc$ cd /usr student@uso:/usr$ pwd /usr
On a changé le chemin actuel de /etc à /usr. Cette commande peut être utilisée n'importe où car il s'agit d'un chemin absolu.
Nous changeons le chemin actuel en /usr/bin en utilisant le chemin relatif :
student@uso:~$ pwd /home/student student@uso:~$ cd ../../usr/bin student@uso:/usr/bin$ pwd /usr/bin
Remarquez comment nous avons grimpé dans la hiérarchie en utilisant .. vers / (le répertoire racine) puis vers le bas jusqu'à usr puis bin.
Dans l'exemple ci-dessous, la commande ci-dessus n'est pas valide :
student@uso:~/Desktop$ pwd /home/student/Desktop student@uso:~/Desktop$ cd ../../usr/bin bash: cd: ../../usr/bin: No such file or directory
Nous remarquons que nous sommes au chemin /home/student/Desktop. En exécutant la commande cd ../../usr/bin ci-dessus, nous arriverions au chemin /home/usr/bin qui n'existe pas.
La fonction de complétion de tab est probablement l'une des fonctions les plus utiles exposées par le shell. En appuyant simplement sur la touche Tab tout en tapant le nom d'une commande, une option de commande ou le chemin d'accès à un répertoire ou à un fichier, le shell complétera automatiquement le texte ou suggérera des options de saisie semi-automatique.
Pour une meilleure efficacité, nous pouvons utiliser des symboles pour interagir avec l'utilitaire cd.
Nous utilisons le caractère (~) pour faire référence au répertoire personnel de l'utilisateur.
student@uso:/usr/bin$ cd /tmp/ student@uso:/tmp$ pwd /tmp student@uso:/tmp$ cd ~ student@uso:~$ pwd /home/student student@uso:~$ cd /usr/bin/X11/ student@uso:/usr/bin/X11$ pwd /usr/bin/X11 student@uso:/usr/bin/X11$ cd ~ student@uso:~$ pwd /home/student
Le fichier est l'unité de base utilisée pour stocker des informations. Qu'il s'agisse d'un document (thème la mate) ou d'un jeu, qu'il s'agisse d'une configuration dans le système d'exploitation, ou du système d'exploitation lui-même, nous utilisons des fichiers pour le stockage.
Nous utilisons la ligne de commande pour interagir avec les fichiers dans plusieurs cas :
Une autre raison d'utiliser la ligne de commande est qu'elle utilise beaucoup moins de ressources que l'interface graphique. Ainsi, nous pouvons faire plus avec moins de ressources.
Le composant qui gère l'interprétation des commandes s'appelle un shell. Le shell lit les commandes données par l'utilisateur, les interprète et indique au système d'exploitation quoi faire.
Dans ce chapitre, nous expliquons comment nous interagissons avec les fichiers sur la ligne de commande.
codespace@codespaces-5e93d3:/workspaces/lab1-simplifiee$ mkdir /workspaces/lab1-simplifiee/sde_lab01/ codespace@codespaces-5e93d3:/workspaces/lab1-simplifiee$ cd /workspaces/lab1-simplifiee/sde_lab01/ student@uso:~/sde_lab01$ pwd /workspaces/lab1-simplifiee/sde_lab01/
Tout comme un dossier contient de nombreuses feuilles, les répertoires contiennent également de nombreux fichiers et répertoires.
Pour afficher le contenu d'un répertoire, nous utilisons la commande ls :
student@uso:~$ ls Desktop Downloads Pictures Templates examples.desktop vm-actions-log.txt Documents Music Public Videos uso.git
Nous voyons plus de détails sur les fichiers et répertoires dans le répertoire /home/student (c'est-à-dire le répertoire personnel de l'utilisateur étudiant, ~) en utilisant la commande ls -l :
student@uso:~$ student@uso:~$ ls -l total 56 drwxr-xr-x 2 student student 4096 aug 6 2018 Desktop drwxr-xr-x 3 student student 4096 aug 20 2018 Documents drwxr-xr-x 2 student student 4096 aug 6 2018 Downloads drwxr-xr-x 2 student student 4096 aug 6 2018 Music drwxr-xr-x 2 student student 4096 aug 6 2018 Pictures drwxr-xr-x 2 student student 4096 aug 6 2018 Public drwxr-xr-x 2 student student 4096 aug 6 2018 Templates drwxr-xr-x 2 student student 4096 aug 6 2018 Videos -rw-r--r-- 1 student student 8980 aug 6 2018 examples.desktop drwxr-xr-x 14 student student 4096 aug 20 2018 uso.git -rw-r--r-- 1 student student 4827 aug 21 2018 vm-actions-log.txt
Nous interprétons les résultats ci-dessus :
Lister le contenu des répertoires /usr, /tmp, /etc, /home.
Il y a des situations où nous voulons créer des fichiers. Par exemple, nous voulons écrire du code ou prendre des notes dans une classe.
Les fichiers sont créés à l'aide de l'utilitaire touch.
Nous créons un fichier comme celui-ci :
student@uso:~$ cd /home/student/uso_lab02/ student@uso:~/uso_lab02$ pwd /home/student/uso_lab02 student@uso:~/uso_lab02$ ls cities ls: cannot access 'cities': No such file or directory student@uso:~/uso_lab02$ touch cities student@uso:~/uso_lab02$ ls cities cities
Si nous voulons créer un fichier avec le nom de villes roumaines, c'est-à-dire que nous voulons que le nom du fichier contienne le caractère espace, nous utilisons toujours la commande touch comme dans l'exemple ci-dessous :
student@uso:~/uso_lab02$ touch cities romania student@uso:~/uso_lab02$ ls -l total 0 -rw-rw-r-- 1 student student 0 oct 12 01:05 cities -rw-rw-r-- 1 student student 0 oct 12 01:05 romania
Nous remarquons que dans la commande ci-dessus, nous avons essayé de créer un fichier appelé villes roumanie, mais deux fichiers ont été créés. Pour créer un fichier avec des espaces (space) inclus dans le nom, nous devons utiliser des guillemets au début et à la fin du nom comme ceci : touch “cities romania”.
student@uso:~/uso_lab02$ touch "cities in romania" student@uso:~/uso_lab02$ ls -l total 0 -rw-rw-r-- 1 student student 0 oct 12 01:05 cities -rw-rw-r-- 1 student student 0 oct 12 01:05 'cities in romania' -rw-rw-r-- 1 student student 0 oct 12 01:05 romani
Il est utile de créer les répertoires lorsque nous voulons conserver les fichiers dans le système de manière organisée. Par exemple, nous pouvons créer un répertoire pour chaque année du diplôme. Pour chaque année/répertoire, nous créons un répertoire pour chaque matière et pour chaque matière nous pouvons faire des répertoires pour les devoirs, les laboratoires, les cours, etc.
Nous créons les répertoires à l'aide de l'utilitaire mkdir. L'étymologie de la commande vient de la langue anglaise - make directory.
Nous créons un répertoire GameOfThrones et Avengers dans le répertoire ~ comme dans l'exemple ci-dessous :
student@uso:~$ cd ~/uso_lab02/ student@uso:~/uso_lab02$ mkdir GameOfThrones student@uso:~/uso_lab02$ mkdir Avengers student@uso:~/uso_lab02$ ls -l total 8 drwxrwxr-x 2 student student 4096 oct 12 01:07 Avengers drwxrwxr-x 2 student student 4096 oct 12 01:07 GameOfThrones (...)
codespace@codespaces-5e93d3:/workspaces/lab1-simplifiee$ mkdir /workspaces/lab1-simplifiee/sde_lab01/ codespace@codespaces-5e93d3:/workspaces/lab1-simplifiee$ cd /workspaces/lab1-simplifiee/sde_lab01/ student@uso:~/sde_lab01$ pwd /workspaces/lab1-simplifiee/sde_lab01/
Nous affichons rapidement le contenu du fichier Arya dans le répertoire GameOfThrones à l'aide de la commande cat :
student@uso:~/uso_lab02$ cat GameOfThrones/Arya student@uso:~/uso_lab02$
La commande cat n'a rien affiché car le fichier Arya est vide.
Nous écrivons le texte Une fille n'a pas de nom dans le fichier Arya en utilisant la commande echo :
student@uso:~/uso_lab02$ echo "A girl has no name" > "GameOfThrones/Arya" student@uso:~/uso_lab02$ cat "GameOfThrones/Arya" A girl has no name
Nous supprimons le fichier “Hulk” du répertoire “Avengers” à l'aide de l'utilitaire rm :
student@uso:~/uso_lab02$ ls Avengers/ Captain America Hulk Iron Man Thor student@uso:~/uso_lab02$ rm Avengers/Hulk student@uso:~/uso_lab02$ ls Avengers/ Captain America Iron Man Thor
Sur la première commande, j'ai affiché quels fichiers se trouvent dans le répertoire Avengers. On a utilisé l'utilitaire rm pour supprimer le fichier Hulk du répertoire Avengers. Enfin on a vérifié que le fichier Hulk n'existe plus dans le répertoire Avengers.
Les répertoires sont supprimés à l'aide de la commande rmdir ou de la commande rm -r. L'étymologie de la commande vient de l'anglais - supprimer le répertoire. Nous essayons de supprimer le répertoire Avengers en utilisant les deux commandes :
student@uso:~/uso_lab02$ ls -l total 60 drwxr-xr-x 2 student student 4096 Sep 29 18:02 Avengers (...) drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones (...) student@uso:~/uso_lab02$ rmdir Avengers/ rmdir: failed to remove 'Avengers/': Directory not empty
Pour supprimer un répertoire qui n'est pas vide, c'est-à-dire un répertoire contenant au moins un fichier ou un répertoire, nous utilisons l'utilitaire rm avec l'option de récursivité -r : rm -r. Cela vous permet de supprimer toute la hiérarchie des fichiers dans le répertoire, en bref : supprimer tout le répertoire.
student@uso:~/uso_lab02$ rm -r Avengers/ student@uso:~/uso_lab02$ ls -l total 52 (...) drwxr-xr-x 2 student student 4096 Sep 29 17:44 GameOfThrones (...)
Les fichiers et les répertoires sont renommés de la même manière à l'aide de la commande mv comme ceci : mv nom_actuel nouveau_nom.
Nous renommons les fichiers et répertoires à l'aide de la commande mv :
student@uso:~/uso_lab02$ ls GameOfThrones student@uso:~/uso_lab02$ mv GameOfThrones ThroneOfGames student@uso:~/uso_lab02$ ls ThroneOfGames
On a renommé le fichier GameOfThrones en ThroneOfGames.
Un autre rôle de la commande mv est de déplacer des fichiers et des répertoires, dans la hiérarchie des fichiers, d'un endroit à un autre.
Nous déplaçons le répertoire GameOfThrones (avec tout son contenu) vers le chemin /tmp/ en utilisant la commande mv :
student@uso:~/uso_lab02$ ls Avengers GameOfThrones student@uso:~/uso_lab02$ mv GameOfThrones/ /tmp/ student@uso:~/uso_lab02$ ls /tmp/ GameOfThrones ssh-ApUMKI3HSJ student@uso:~/uso_lab02$ ls /tmp/ GameOfThrones ssh-ApUMKI3HSJ student@uso:~/uso_lab02$ ls Avengers
Maintenant, le répertoire GameOfThrones se trouve dans le chemin /tmp/GameOfThrones. On a vérifié en utilisant ls qu'il n'est plus dans le répertoire courant et existe dans le répertoire /tmp/.
Nous reculons le répertoire GameOfThrones (avec tout son contenu) en utilisant un chemin relatif pour pointer vers le répertoire et un chemin absolu pour pointer vers l'endroit où nous voulons que le répertoire se termine en utilisant mv :
student@uso:~/uso_lab02$ mv ../../../tmp/GameOfThrones/ /home/student/ student@uso:~/uso_lab02$ ls Avengers GameOfThrones