Table of Contents

TP 01 - Travailler avec des fichiers

Assignment

Vous devez accepter le assignment d'ici et travailler avec ce repository: Lab1

Chemins dans la hiérarchie des fichiers

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.

Le chemin actuel

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.

Chemin relatif et chemin absolu

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 :

Chemin absolue

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).

Chemin relatif

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.

Entrée '..' du système de fichiers

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.

Exercises
  1. Afficher le chemin actuel à l'aide de l'utilitaire pwd
  2. Reportez-vous aux fichiers/répertoires /lib/, /home, /bin/cat par des chemins relatifs et absolus
  3. Reportez-vous au répertoire parent (un niveau au-dessus du répertoire actuel)

Changer le chemin actuel

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.

Comme toutes les commandes du système de fichiers, la commande cd prend un chemin comme paramètre. Cela peut être à la fois relatif et 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

L'une des informations les plus importantes lorsque vous travaillez dans le système d'exploitation (en particulier dans la ligne de commande) est l'endroit où nous nous trouvons. Si nous savons où nous sommes, nous pouvons nous orienter vers notre destination. Nous savons où nous utilisons la commande pwd ; nous nous déplaçons ailleurs en utilisant la commande cd.

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.

Exercises
  1. Remplacez le répertoire actuel par le répertoire dans le chemin /usr/bin. Utilisez le chemin absolu.
  2. Remplacez le répertoire actuel par le répertoire dans le chemin /etc/. Utilisez le chemin relatif.
  3. Remplacez le répertoire actuel par le répertoire dans le chemin /etc/network/. Utilisez le chemin relatif.

TAB completion

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.

Raccourcis

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

Lorsque nous sommes dans le répertoire personnel, l'invite contient le caractère ~ pour l'indiquer.

Interagir avec des fichiers sur la ligne de commande

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.

Pour les exercices de ce chapitre, assurez-vous d'être dans le répertoire workspaces/lab1-simplifiee/sde_lab01/. Pour ce faire, exécutez les commandes suivantes :

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/

Travailler avec des fichiers et des répertoires

Afficher le contenu d'un répertoire

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 :

  1. Le premier caractère - nous montre que examples.desktop est un fichier normal. Le premier caractère d nous indique que Desktop est un répertoire.
  2. Les chaînes rw-r–r– (pour examples.desktop) et rwxr-xr-x (pour Desktop) font référence aux autorisations d'accès
  3. Les deux mots suivants, étudiant, font également référence aux autorisations et à la propriété
  4. Le nombre 8980 indique la taille du fichier examples.desktop. Nous remarquons que le répertoire Desktop a une taille de 4096 octets
  5. Il y a 3 colonnes qui indiquent l'heure du dernier changement. Un accès peut signifier créer ou modifier. La lecture ne change pas cette date.
  6. Le nom du fichier ou du répertoire est affiché à la fin
Exercises

Lister le contenu des répertoires /usr, /tmp, /etc, /home.

Création de fichiers

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

Création de répertoires

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
(...)
Exercises

Pour les exercices de ce chapitre, assurez-vous d'être dans le répertoire /workspaces/lab1-simplifiee/sde_lab01/. Pour ce faire, exécutez les commandes suivantes :

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/

  1. Créez un répertoire nommé “WinnieThePooh” et un autre nommé “TomSiJerry”.
  2. Créez les fichiers « Iron Man », « Hulk », « Thor », « Captain America » (avec espace) dans le répertoire « Avengers » ; afficher les fichiers dans le répertoire
  3. Créez les fichiers « Arya », « Daenerys Targaryen » (avec espace), « Jon Snow », « Tyrion Lannister » dans le répertoire « GameOfThrones » ; afficher les fichiers dans le répertoire.

Afficher le contenu d'un fichier

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

Suppression de fichiers

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.

Suppression de répertoires

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

La commande rmdir sur un répertoire non vide (qui contient au moins un autre fichier ou répertoire) ne fonctionne pas.

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
(...)

Renommer et déplacer des fichiers et des répertoires

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

Notez que nous pouvons utiliser des chemins relatifs et absolus comme arguments de la commande mv pour déplacer/renommer des fichiers et des répertoires.

Exercises
  1. Créez un répertoire Vikings dans le répertoire au chemin /workspaces/lab1-simplifiee/sde_lab01/.
  2. Créez des fichiers Ragnar, Rollo, Lagertha dans le répertoire Vikings.
  3. Vérifiez que le répertoire et les fichiers ont été créés.
  4. Déplacez le répertoire (ainsi que toute la hiérarchie des fichiers) vers l'emplacement /tmp/.
  5. Vérifiez que le répertoire et la hiérarchie des fichiers ont été déplacés.
  6. Créez un répertoire NBA dans le répertoire au chemin /home/student/uso_lab02.
  7. Créez les fichiers MichaelJordan, LeBronJames, DwayneWade et KobeBryant dans le répertoire NBA.
  8. Déplacez le répertoire NBA (ainsi que toute la hiérarchie des fichiers) vers le répertoire Vikings.
  9. Renommez le répertoire GameOfThrones en ThronesInTheGame.
  10. Déplacez les fichiers à l'intérieur du répertoire ThronesInTheGame vers /tmp.
  11. Déplacez le répertoire vers son emplacement d'origine en utilisant à la fois des chemins relatifs et absolus.