Les exercices pratiques sur les systèmes d’exploitation comportent des exercices théoriques et pratiques. Pour résoudre les exercices pratiques, vous avez besoin d’un shell UNIX. Un shell très populaire est Bash. Le terminal Apple Mac OS X est suffisant pour la plupart des exercices pratiques. L’invite de commande Windows et Windows PowerShell ne sont pas suffisants pour les exercices.
Pour vous préparer, l’idéal est d’installer sur votre système le système d’exploitation Linux. Une installation dans une machine virtuelle est suffisante. Les distributions faciles à utiliser sont, par exemple, Debian, Ubuntu et CentOS. VirtualBox est une solution de virtualisation gratuite.
Vous pouvez également travailler avec un système vivant sur CD, DVD ou lecteur de mémoire flash USB. Dans ce cas, aucune installation locale n’est nécessaire.
Exercice 1:
1.1) Créez un fichier Citation.txt avec ce contenu à l’aide de la commande echo :
Ce sont les tonneaux vides
qui font le plus de bruit.
Phocion
$ echo -e "Ce sont les tonneaux vides\nqui font le plus de bruit.\n\nPhocion" > Citation.txt
echo -e: Affiche une chaîne de texte tout en interprétant les caractères spéciaux (comme \n pour un saut de ligne).
« Ce sont les tonneaux vides\nqui font le plus de bruit.\n\nPhocion »:
Le texte contient des sauts de ligne :
\n : Saut de ligne, donc le texte sera affiché sur plusieurs lignes.
Deux sauts de ligne consécutifs \n\n créent un espace vide entre « bruit. » et « Phocion ».
>: Redirige la sortie de la commande vers un fichier.
Citation.txt: Nom du fichier dans lequel le texte sera enregistré. Si ce fichier existe déjà, son contenu sera écrasé.
1.2) Affichez le nombre de caractères dans le fichier Citation.txt à l’aide de la commande wc.
$ wc -m Citation.txt
wc: C’est une commande qui signifie « word count » (compte de mots) et est utilisée pour compter le nombre de lignes, de mots et de caractères dans un fichier.
-m: Cette option indique à wc de compter le nombre de caractères (y compris les espaces et les retours à la ligne) dans le fichier.
Citation.txt: C’est le nom du fichier sur lequel la commande est exécutée.
1.3) Affichez le nombre de mots dans le fichier Citation.txt et redirigez la sortie vers la commande wc.
$ wc -w Citation.txt
-w: Cette option indique à wc de compter le nombre de mots dans le fichier.
1.4) Affichez le calendrier de l’année 1999 et redirigez la sortie dans un nouveau fichier Calendrier.txt.
$ cal 1999 > Calendrier.txt
cal 1999: Affiche le calendrier de l’année 1999 dans le terminal.
>: Redirige la sortie de la commande vers un fichier.
Calendrier.txt: Nom du fichier dans lequel le calendrier sera enregistré. Si ce fichier existe déjà, son contenu sera écrasé.
1.5) Utilisez la commande date pour créer une sortie dans l’interpréteur de commandes avec la date actuelle et formulée comme dans l’exemple suivant:
Aujourd'hui, nous sommes le jeudi 24 octobre 2013.
Il est 16h08 et 07 secondes.
En temps UNIX, il est exactement: 1382623687
Rediriger la sortie de manière à ce qu’elle soit ajoutée au fichier Calendrier.txt.
$ date +"Aujourd'hui, nous sommes le %A %d. %B %Y.%nIl est %Hh%M et %S secondes.%nEn temps UNIX, il est exactement: %s" >> Calendrier.txt
date: Affiche la date et l’heure actuelles.
+"...": Permet de formater la sortie de la commande avec des spécificateurs.
Spécificateurs utilisés:
%A: Nom complet du jour de la semaine.
%d: Jour du mois (01 à 31).
%B: Nom complet du mois.
%Y: Année sur quatre chiffres.
%H: Heure (00 à 23).
%M: Minutes (00 à 59).
%S: Secondes (00 à 59).
%s: Temps UNIX (nombre de secondes depuis le 1er janvier 1970).
\n: Saut de ligne.
>>: Redirige la sortie de la commande pour l’ajouter à la fin du fichier, au lieu de l’écraser.
Calendrier.txt: Nom du fichier dans lequel les informations seront ajoutées.
1.6) Calculez le nombre d’entrées (fichiers et répertoires) dans le répertoire /src à l’aide de la commande wc. De plus, la vitesse de traitement doit être mesurée.
$ time ls -l /src | wc -l
time: Mesure le temps d’exécution de la commande qui suit. Elle affiche le temps écoulé, le temps CPU utilisé, etc.
ls -l /src: Liste les fichiers et répertoires dans le dossier /src avec des détails (permissions, propriétaire, taille, etc.). Le -l signifie « long format ».
|: Le symbole de pipe redirige la sortie de la commande précédente (ls -l /src) vers la commande suivante (wc -l).
wc -l: Compte le nombre de lignes dans la sortie reçue. Dans ce cas, cela correspond au nombre de fichiers et de répertoires dans /src.
1.7) Afficher la liste des alias existants dans l’interpréteur de commandes.
$ alias
Lorsque vous exécutez simplement alias sans arguments, cela affiche une liste de tous les alias actuellement définis dans votre session de terminal. Un alias est un raccourci pour une commande ou une séquence de commandes.
1.8) Créer un alias temps, qui produit la sortie de la question 1.6.
$ alias temps="time ls -l /src | wc -l"
alias: Crée un alias, qui est un raccourci pour une commande ou une séquence de commandes.
temps: C’est le nom de l’alias que vous créez. Vous pourrez utiliser ce nom pour exécuter la commande associée.
1.9) Supprimer l’alias temps.
$ unalias temps
unalias: Cette commande est utilisée pour supprimer un alias précédemment défini.
temps: C’est le nom de l’alias que vous souhaitez supprimer.
1.10) Recherchez, à l’aide d’une commande appropriée, tous les fichiers de votre répertoire personnel qui correspondent à ces critères de recherche:
La recherche ne porte que sur les fichiers et non sur les répertoires ou les liens.
Le nom du fichier doit contenir la chaîne COURS (insensible à la casse).
Les fichiers doivent appartenir à votre compte d’utilisateur (ID utilisateur).
L’âge des fichiers doit être d’au moins 1 jour.
La dernière modification doit avoir eu lieu il y a plus de 3 jours.
La taille du fichier doit être d’au moins 10 kB.
Pour chaque fichier trouvé, le nombre de lignes doit être affiché dans l’interpréteur de commandes.
find . : Commence la recherche dans le répertoire courant (.).
-iname "*cours*": Recherche des fichiers dont le nom contient le mot « cours », sans tenir compte de la casse (majuscule/minuscule).
-user USERNAME: Filtre les résultats pour ne montrer que les fichiers appartenant à l’utilisateur spécifié (remplacez USERNAME par le nom réel de l’utilisateur).
-atime -1: Trouve les fichiers qui ont été accédés dans les dernières 24 heures.
-mtime +3: Trouve les fichiers qui ont été modifiés il y a plus de 3 jours.
-type f: Limite les résultats aux fichiers réguliers (exclut les répertoires, liens, etc.).
-size +10k: Filtre pour ne trouver que les fichiers de plus de 10 kilooctets.
-exec wc -l "{}" ";": Pour chaque fichier trouvé, exécute la commande wc -l, qui compte le nombre de lignes dans le fichier. Les {} sont remplacés par le nom du fichier trouvé. Le ; indique la fin de la commande à exécuter.
Exercice 2: Permissions et liens
2.1) Quelle commande peut être utilisée pour spécifier que tous les nouveaux fichiers créés ont ces permissions : -r–r–r–
$ umask 222
umask: C’est une commande qui définit le masque de création (umask) pour les fichiers et répertoires nouvellement créés. Ce masque détermine les permissions par défaut qui seront retirées lors de la création de nouveaux fichiers ou répertoires.
222: Ce chiffre représente le masque en notation octale. Chaque chiffre correspond à une permission: 2: Retire la permission d’écriture (w) pour le propriétaire, le groupe et les autres. Ainsi, le masque 222 retire les permissions d’écriture, ce qui signifie que les nouveaux fichiers seront créés avec des permissions qui n’incluent pas l’écriture pour quiconque.
Attention! Si vous avez exécuté la commande, vous devez corriger vos autorisations à l’étape suivante. Sinon, vous ne pourrez pas travailler confortablement dans votre répertoire personnel.
2.2) Créez dans votre répertoire personnel un répertoire portant le nom COURS_Links. Naviguez vers le nouveau répertoire et essayez d’effacer l’entrée « . ».
$ mkdir ~/COURS_Links && cd ~/COURS_Links
$ rm .
mkdir ~/COURS_Links: Crée un répertoire nommé COURS_Links dans le répertoire personnel de l’utilisateur (~).
&&: C’est un opérateur qui exécute la commande suivante uniquement si la commande précédente a réussi (c’est-à-dire si le répertoire a été créé sans erreur).
cd ~/COURS_Links: Change le répertoire courant pour le nouveau répertoire COURS_Links.
rm . : La commande rm est généralement utilisée pour supprimer des fichiers ou des répertoires. . fait référence au répertoire courant.
2.3) Créer dans le répertoire COURS_Links _________
un fichier vide Original.
un lien dur HardLink, qui pointe vers le fichier Original.
un lien symbolique SymbLink, qui pointe sur le fichier Original.
$ touch Original
$ ln Original HardLink
$ ln -s Original SymbLink
touch Original: Crée un fichier vide nommé Original s’il n’existe pas déjà, ou met à jour la date et l’heure d’accès du fichier s’il existe.
ln Original HardLink: Crée un lien dur nommé HardLink qui pointe vers le fichier Original. Un lien dur permet d’accéder au même fichier via deux noms différents dans le système de fichiers. Les deux noms partagent le même inode, ce qui signifie que toute modification dans l’un affecte l’autre.
ln -s Original SymbLink: Crée un lien symbolique nommé SymbLink qui pointe vers Original. Contrairement au lien dur, le lien symbolique est une sorte de raccourci: il fait référence au chemin du fichier d’origine, mais ne partage pas le même inode. Si Original est supprimé, SymbLink deviendra « cassé » et ne pointera plus vers un fichier valide.
2.4) Vérifier les inodes du fichier Original et les deux liens via ls -li
$ ls -li Original SymbLink
ls: C’est une commande qui liste le contenu d’un répertoire.
-l: Cette option affiche les informations détaillées sur chaque fichier ou répertoire, y compris les permissions, le propriétaire, le groupe, la taille, la date de modification et le nom.
-i: Cette option affiche le numéro d’inode de chaque fichier. Un inode est une structure de données qui contient des informations sur un fichier (comme son emplacement sur le disque).
Original SymbLink: Ce sont les noms des fichiers que vous souhaitez lister. Dans ce cas, Original est le fichier créé précédemment, et SymbLink est le lien symbolique pointant vers Original.
2.5) Est-il possible de copier des liens en dur (aussi appelée un lien physique) ? Essayez de copier le lien.
Il est possible de copier des liens physiques à l’intérieur d’un système de fichiers, mais il est impossible de copier un lien physique vers un autre système de fichiers ou une autre partition, car les liens physiques ne sont que des entrées du système de fichiers qui renvoient à un inode.
2.6) Est-il possible de copier des liens symboliques ? Essayez de copier le lien.
Il est possible de copier des liens symboliques parce qu’il s’agit simplement de fichiers (texte) contenant des informations sur le chemin d’accès.
2.7) Vérifiez le résultat de votre copie à l’aide de ls -li. Quelles sont vos conclusions ?
Si un lien physique est copié, une nouvelle entrée de répertoire est créée, qui fait référence à un inode.
Si un lien symbolique est copié, un nouveau fichier (avec un nouveau numéro d’inode) est créé.
2.8) Le nombre de liens des fichiers indique le nombre d’entrées de répertoire qui renvoient à un inode. Qu’est-ce qui indique le nombre de liens dans les répertoires et qu’est-ce qui influence le nombre de liens dans les répertoires ?
Chaque répertoire possède deux liens physiques à partir du moment où il est créé. L’un de ces liens est le nom du répertoire lui-même, et l’autre est le point « . », qui renvoie au répertoire situé un niveau au-dessus dans la hiérarchie du système de fichiers. Par conséquent, le compteur de liens physiques de chaque répertoire a une valeur de 2 à partir du moment où il est créé. Pour chaque sous-répertoire supplémentaire, un autre lien physique est créé et le compteur de liens physiques est incrémenté de 1. Ainsi, le nombre de sous-répertoires à l’intérieur d’un répertoire est égal au nombre de liens physiques – 2.
Exercice 3: Wildcards et Filters
3.1) Créez un répertoire TestRep dans votre répertoire personnel. Naviguez jusqu’à ce répertoire et créez ces fichiers :
$ mkdir ~/TestRep && cd ~/TestRep
$ touch help.bat
$ touch hello.bat
$ for ((i=1; i < 8; i++)) ; do touch file$i.sav ; done
$ for ((i=1; i < 11; i++)) ; do touch test$i.txt ; done
$ touch lorem.bat
mkdir ~/TestRep :
Crée un répertoire nommé TestRep dans votre répertoire personnel (~).
&& cd ~/TestRep :
Change le répertoire courant pour TestRep, mais seulement si la création du répertoire a réussi.
$ touch help.bat :
Crée un fichier vide nommé help.bat.
$ touch hello.bat :
Crée un fichier vide nommé hello.bat.
for ((i=1; i < 8; i++)) ; do touch file$i.sav ; done :
Cette boucle crée des fichiers nommés file1.sav, file2.sav, ..., jusqu'à file7.sav.
La syntaxe ((i=1; i < 8; i++)) initialise i à 1, et continue jusqu'à 7.
for ((i=1; i < 11; i++)) ; do touch test$i.txt ; done :
Cette boucle crée des fichiers nommés test1.txt, test2.txt, ..., jusqu'à test10.txt.
$ touch lorem.bat :
Crée un fichier vide nommé lorem.bat.
3.2) Quelle commande permet d'afficher une liste de tous les fichiers du répertoire dont les noms commencent par le motif « test » ?
$ ls -1 | grep -e "^test"
ls -1 :
Liste les fichiers et répertoires dans le répertoire courant, en affichant un fichier par ligne. Le -1 (chiffre un) signifie que la sortie sera formatée en une seule colonne.
| :
Le symbole de pipe redirige la sortie de la commande précédente (ls -1) vers la commande suivante (grep).
grep -e "^test" :
grep est utilisé pour filtrer les lignes de texte. L'option -e spécifie une expression régulière.
^test est l'expression régulière :
^ indique le début d'une ligne.
test est le texte que l'on recherche.
Cela signifie que grep affichera uniquement les lignes (noms de fichiers) qui commencent par "test".
Solution alternative:
$ ls test*
ls: C'est une commande utilisée pour lister les fichiers et répertoires dans un répertoire.
test*: Le * est un caractère générique (wildcard) qui représente zéro ou plusieurs caractères. Cela signifie que la commande va rechercher tous les fichiers et répertoires dont le nom commence par "test" suivi de n'importe quelle chaîne de caractères.
3.3) Quelle commande permet d'afficher une liste de tous les fichiers du répertoire dont le nom contient le motif 'cd' ?
$ ls -1 | grep -e "cd"
Solution alternative:
$ ls *cd*
3.4) Quelle commande permet d'afficher la liste des fichiers file2.sav,...,file5.sav du répertoire ?
$ ls -1 | grep -e "file[2-5].sav"
Solution alternative:
$ ls file[2-5].sav
3.5) Quelle commande permet d'afficher une liste de tous les fichiers du répertoire dont le nom contient les caractères c ou z en position 3 ?
$ ls -1 | grep -e "^.\{2\}[cz]"
grep -e "^.\{2\}[cz]":
grep filtre les lignes selon l'expression régulière donnée.
^: Indique le début de la ligne.
.\{2\}: Correspond à exactement deux caractères de n'importe quel type.
[cz]: Correspond à un caractère qui doit être soit un c soit un z.
Solution alternative:
$ ls ??[cz]*
ls: Liste les fichiers et répertoires dans le répertoire courant.
??: Les deux points d'interrogation (?) correspondent à n'importe quel caractère, mais chacun doit être exactement un seul caractère. Donc, ?? attend deux caractères au début du nom du fichier.
[cz]: Cela spécifie que le troisième caractère du nom doit être soit un c soit un z.
*: Le caractère astérisque (*) correspond à zéro ou plusieurs caractères. Cela signifie que, après c ou z, il peut y avoir n'importe quel nombre de caractères supplémentaires.
3.6) Quelle commande permet d'afficher une liste de tous les fichiers du répertoire dont les noms commencent par le caractère a et se terminent par le caractère t et qui contiennent également le caractère c à n'importe quelle position ?
$ ls -1 | grep -e "^a.*c.*t$"
grep : C'est une commande utilisée pour rechercher des lignes dans un fichier ou dans une entrée standard qui correspondent à un motif spécifique.
-e : Cette option indique à grep que ce qui suit est une expression régulière à utiliser pour la recherche.
"^a.*c.*t$" : C'est l'expression régulière que grep utilise pour filtrer les lignes :
^ : Indique le début de la ligne.
a : Le caractère a doit être le premier caractère de la ligne.
.* : Le point (.) correspond à n'importe quel caractère, et l'astérisque (*) signifie "zéro ou plusieurs fois". Cela signifie qu'il peut y avoir n'importe quel nombre de caractères entre a et c, puis entre c et t.
c : Le caractère c doit apparaître après a, mais il peut être séparé par n'importe quels caractères.
.* : Encore une fois, cela permet d'avoir n'importe quels caractères après c avant d'atteindre t.
t$ : Le caractère t doit être le dernier caractère de la ligne ($ indique la fin de la ligne).
Solution alternative:
$ ls [a]*c*t
ls : Liste les fichiers et répertoires dans le répertoire courant.
[a] : Le groupe de crochets signifie que le premier caractère du nom doit être un a. Cela correspond à un seul caractère, qui doit être exactement a.
* : Le caractère astérisque (*) correspond à zéro ou plusieurs caractères. Cela signifie qu'il peut y avoir n'importe quel nombre de caractères entre le a et le c.
c : Après le *, le nom doit contenir un c.
* : Un autre astérisque, indiquant qu'il peut y avoir n'importe quel nombre de caractères entre le c et le t.
t : Finalement, le nom doit se terminer par un t.
3.7) Quelle commande peut être utilisée pour afficher une liste des fichiers test1.txt,...,test9.txt dans le répertoire mais sans les fichiers test3.txt et test4.txt.
$ ls test[!34][!0]*
ls: Liste les fichiers et répertoires dans le répertoire courant.
test: Tous les noms de fichiers doivent commencer par test.
[!34]: Ce groupe de crochets signifie que le caractère suivant ne doit pas être un 3 ou un 4. Cela correspond à un seul caractère qui peut être n'importe quel chiffre ou lettre, sauf 3 ou 4.
[!0]: Cela signifie que le caractère suivant ne doit pas être 0. Cela correspond également à un seul caractère qui peut être n'importe quel chiffre ou lettre, sauf 0.
*: Le caractère astérisque (*) correspond à zéro ou plusieurs caractères. Cela signifie qu'il peut y avoir n'importe quel nombre de caractères après les deux premiers caractères spécifiés.
Solution alternative:
$ ls -1 | grep -e "test[^3-4]\.txt"
test: La ligne doit contenir le mot "test".
[^3-4]: Le symbole ^ à l'intérieur des crochets signifie "tout sauf". Donc, cela correspond à un caractère qui n'est ni 3 ni 4. Cela peut être n'importe quel autre caractère.
\.txt: Le \. correspond à un point littéral (car le point est un caractère spécial en expressions régulières), suivi de txt. Cela signifie que le fichier doit se terminer par .txt.