Chapitre 316 minIntermédiaire
Le terminal et les commandes Linux de base
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- lire la forme d'une commande et trouver de l'aide avec
manet--help; - te déplacer avec des chemins absolus et relatifs ;
- créer, copier, déplacer, lire et chercher des fichiers ;
- enchaîner des commandes avec les redirections et les tubes ;
- traduire une commande PowerShell en Bash.
4 exercices corrigés
Le terminal est la fenêtre texte dans laquelle tu tapes des commandes ; le shell, Bash sur Debian, les lit, les exécute et affiche leur résultat. Ce chapitre présente la forme d'une commande, l'aide intégrée, les commandes de base pour se déplacer, manipuler et lire des fichiers, chercher, et enchaîner les commandes avec les redirections et les tubes. C'est le socle de tous les chapitres suivants : sur un serveur sans interface graphique, tout passe par là.
Terminal, console et shell
Trois mots reviennent sans cesse :
- la console est l'écran texte de la machine elle-même (ou celui que t'affiche Proxmox dans l'onglet Console) ;
- le terminal est le programme qui affiche une session texte : Windows Terminal, le Terminal de macOS, ou la session SSH que tu ouvres vers un serveur ;
- le shell est l'interpréteur qui lit ta ligne, la découpe, lance les programmes et te rend la main. Debian utilise Bash pour les sessions interactives ; d'autres shells existent (zsh, fish, dash pour les scripts système).
Une commande suit presque toujours la même forme :
commande [options] [arguments]
ls -l -h /var/log
Les options modifient le comportement : courtes avec un tiret (-l), combinables (-lh = -l -h), ou longues avec deux tirets (--human-readable). Les arguments disent sur quoi agir : un fichier, un dossier, un nom d'utilisateur. Linux distingue les majuscules et les minuscules partout : Rapport.txt et rapport.txt sont deux fichiers différents, ls -R et ls -r deux options différentes.
Trouver de l'aide
Personne ne retient toutes les options. On sait où les trouver :
| Commande | Ce qu'elle donne |
|---|---|
man ls | Le manuel complet de ls. Dans le manuel : /mot cherche, n passe à l'occurrence suivante, q quitte |
ls --help | Un résumé des options, directement dans le terminal |
man -k partition | La liste des pages de manuel dont la description contient « partition » (apropos partition fait de même) |
type cd | Dit si cd est un programme, une commande interne du shell ou un alias |
help cd | L'aide des commandes internes de Bash, qui n'ont pas de page de manuel à elles |
Se déplacer dans les dossiers
Tous les fichiers sont rangés dans une seule arborescence qui part de la racine / (chapitre 4). Un chemin absolu part de la racine (/var/log/nginx) ; un chemin relatif part du dossier courant (nginx/access.log si tu es déjà dans /var/log).
| Commande | Effet |
|---|---|
pwd | Affiche le dossier courant (print working directory) |
cd /var/log | Va dans /var/log (chemin absolu) |
cd nginx | Va dans le sous-dossier nginx du dossier courant (chemin relatif) |
cd .. | Remonte d'un niveau (.. = le dossier parent, . = le dossier courant) |
cd ou cd ~ | Retourne dans ton dossier personnel, /home/clambert |
cd - | Revient au dossier précédent |
ls | Liste le contenu du dossier courant |
ls -l | Format long : droits, propriétaire, taille, date |
ls -la | Format long, fichiers cachés compris (leur nom commence par un point) |
ls -lh | Tailles lisibles (4,0K, 12M) |
ls -lt | Trié par date de modification, le plus récent en premier |
tree -L 2 | L'arborescence sur deux niveaux (paquet tree à installer) |
clambert@srv-web:~$ cd /etc/nginx
clambert@srv-web:/etc/nginx$ ls -l
total 56
drwxr-xr-x 2 root root 4096 15 oct. 10:12 conf.d
-rw-r--r-- 1 root root 1125 13 juin 14:05 fastcgi.conf
-rw-r--r-- 1 root root 1484 13 juin 14:05 nginx.conf
drwxr-xr-x 2 root root 4096 15 oct. 10:14 sites-available
drwxr-xr-x 2 root root 4096 15 oct. 10:14 sites-enabled
...
Chaque ligne du format long se lit ainsi : le type et les droits (drwxr-xr-x, le d signale un dossier, chapitre 6), le nombre de liens, le propriétaire et le groupe, la taille en octets, la date de dernière modification, le nom.
Créer, copier, déplacer, supprimer
| Commande | Effet |
|---|---|
mkdir sauvegardes | Crée un dossier |
mkdir -p /srv/www/suivi/static | Crée toute la chaîne de dossiers manquants |
touch notes.txt | Crée un fichier vide (ou met à jour la date d'un fichier existant) |
cp nginx.conf nginx.conf.bak | Copie un fichier |
cp -a /etc/nginx /root/nginx-2026-11-04 | Copie un dossier entier en conservant droits, propriétaires et dates |
mv ancien.txt nouveau.txt | Renomme |
mv rapport.txt /tmp/ | Déplace |
rm fichier.txt | Supprime un fichier |
rm -r dossier | Supprime un dossier et tout son contenu |
rmdir dossier | Supprime un dossier vide seulement |
Les caractères génériques (wildcards) sont remplacés par le shell avant l'exécution : * vaut n'importe quelle suite de caractères, ? un seul caractère, [0-9] un caractère de la liste. ls /var/log/*.log liste les fichiers en .log ; rm access.log.[2-9].gz supprime les archives 2 à 9.
Lire un fichier
| Commande | Usage |
|---|---|
cat fichier | Affiche tout le fichier (pour les fichiers courts) |
less fichier | Affiche page par page : Espace avance, b recule, /mot cherche, G va à la fin, q quitte |
head -n 20 fichier | Les 20 premières lignes |
tail -n 50 fichier | Les 50 dernières lignes |
tail -f /var/log/nginx/access.log | Affiche la fin du fichier et les lignes ajoutées en direct (Ctrl+C pour sortir) |
wc -l fichier | Compte les lignes (-w les mots, -c les octets) |
file inconnu.bin | Devine le type d'un fichier d'après son contenu |
Pour modifier un fichier de configuration, Debian fournit deux éditeurs en mode texte. nano s'utilise tout de suite : les raccourcis sont affichés en bas (^O = Ctrl+O pour enregistrer, ^X pour quitter, ^W pour chercher). vim (ou vi, présent partout) demande un apprentissage : i pour passer en insertion, Échap pour en sortir, :wq pour enregistrer et quitter, :q! pour quitter sans enregistrer. Avec sudo, ouvre un fichier système par sudoedit /etc/nginx/nginx.conf : l'éditeur tourne avec tes droits, sur une copie, et seul l'enregistrement final se fait en administrateur.
Chercher des fichiers et du texte
find parcourt l'arborescence et filtre selon des critères :
find /etc -name "*.conf" # par nom (les guillemets empêchent le shell de développer *)
find /var/log -type f -size +100M # fichiers de plus de 100 Mio
find /srv/www -mtime -2 # modifiés il y a moins de 2 jours
find /home -user dev-igarnier # appartenant à un utilisateur
find /tmp -type f -mtime +30 -delete # supprimer les fichiers vieux de plus de 30 jours
grep cherche un motif dans le contenu des fichiers :
grep "server_name" /etc/nginx/sites-available/suivi # lignes qui contiennent le motif
grep -i "error" /var/log/nginx/error.log # sans tenir compte de la casse
grep -r "PermitRootLogin" /etc/ssh/ # récursivement dans un dossier
grep -n "listen" /etc/nginx/nginx.conf # avec les numéros de ligne
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$" # sans les commentaires ni les lignes vides
grep -c "Failed password" auth.log # nombre de lignes qui correspondent
grep -E "40[34]" access.log # expression régulière étendue : 403 ou 404
Dans un motif, ^ désigne le début de ligne et $ la fin : ^# correspond aux lignes qui commencent par #, ^$ aux lignes vides.
which et whereis disent où se trouve un programme : which nginx répond /usr/sbin/nginx.
Redirections et tubes
Chaque commande a trois flux : l'entrée standard (stdin, numéro 0, le clavier par défaut), la sortie standard (stdout, 1, l'écran) et la sortie d'erreur (stderr, 2, l'écran aussi). Le shell peut les rediriger :
| Syntaxe | Effet |
|---|---|
commande > fichier | Écrit la sortie dans le fichier, en l'écrasant |
commande >> fichier | Ajoute la sortie à la fin du fichier |
commande 2> erreurs.txt | Écrit les erreurs dans un fichier |
commande > tout.txt 2>&1 | Sortie et erreurs dans le même fichier |
commande 2> /dev/null | Jette les erreurs (/dev/null avale tout) |
commande < fichier | Lit l'entrée depuis un fichier |
cmd1 | cmd2 | Le tube (pipe) : la sortie de cmd1 devient l'entrée de cmd2 |
cmd1 && cmd2 | Lance cmd2 seulement si cmd1 a réussi |
cmd1 || cmd2 | Lance cmd2 seulement si cmd1 a échoué |
Le tube est l'outil le plus puissant du shell : on assemble de petites commandes qui font chacune une chose. Les plus utiles dans un tube :
| Commande | Rôle |
|---|---|
sort | Trie les lignes (-n numérique, -r inverse, -u sans doublons, -t';' -k3 sur le 3e champ) |
uniq -c | Regroupe les lignes identiques consécutives et les compte (d'où un sort avant) |
cut -d';' -f1,3 | Garde les champs 1 et 3, avec ; comme séparateur |
tr 'a-z' 'A-Z' | Remplace des caractères |
sed 's/ancien/nouveau/g' | Remplace un texte par un autre sur chaque ligne |
awk -F';' '{print $3}' | Découpe chaque ligne en champs et affiche le 3e ; awk sait aussi filtrer et calculer |
tee fichier | Affiche et écrit dans un fichier (sudo tee écrit dans un fichier protégé) |
xargs | Transforme les lignes reçues en arguments d'une commande |
Un exemple réel : les dix adresses IP qui ont fait le plus de requêtes sur le site de suivi.
cut -d' ' -f1 /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -n 10
Lis-la de gauche à droite : extraire le premier champ (l'adresse du client), trier pour rapprocher les adresses identiques, compter les doublons, trier par nombre décroissant, garder les dix premières lignes.
Variables, historique et alias
Le shell garde des variables : echo $HOME affiche ton dossier personnel, echo $PATH la liste des dossiers où le shell cherche les programmes. Une variable se crée par NOM=valeur (sans espace autour du =) et se lit par $NOM. export NOM la transmet aux programmes lancés depuis ce shell.
history affiche les commandes tapées ; !42 relance la commande numéro 42. Un alias raccourcit une commande : alias ll='ls -lh'. Pour le garder, ajoute la ligne à la fin de ~/.bashrc, le fichier lu à chaque ouverture de shell.
$(commande) insère le résultat d'une commande dans une autre :
sudo cp -a /etc/nginx /root/nginx-$(date +%F) # crée /root/nginx-2026-11-04
Quand une suite de commandes revient souvent, on l'écrit dans un script Bash, avec des variables, des conditions et des boucles. C'est l'objet du cours Scripts PowerShell et Bash ; les chapitres 9 et 15 de ce cours-ci montrent comment en faire un service ou une tâche planifiée.
De PowerShell à Bash
Si tu as commencé par Windows, cette table de correspondance t'évite de chercher :
| Action | PowerShell | Bash |
|---|---|---|
| Où suis-je ? | Get-Location (pwd) | pwd |
| Lister | Get-ChildItem (ls, dir) | ls -l |
| Changer de dossier | Set-Location (cd) | cd |
| Créer un dossier | New-Item -ItemType Directory (mkdir) | mkdir |
| Copier, déplacer, supprimer | Copy-Item, Move-Item, Remove-Item | cp, mv, rm |
| Lire un fichier | Get-Content (cat) | cat, less |
| Les 20 dernières lignes | Get-Content -Tail 20 | tail -n 20 |
| Chercher du texte | Select-String | grep |
| Chercher un fichier | Get-ChildItem -Recurse -Filter | find |
| Aide | Get-Help | man, --help |
| Processus | Get-Process, Stop-Process | ps, kill |
| Configuration IP | Get-NetIPAddress | ip address |
La grande différence : un tube PowerShell transporte des objets (avec leurs propriétés), un tube Bash transporte du texte, qu'on découpe avec cut, awk ou grep.
Exercices
Les exercices de ce chapitre utilisent le fichier livraisons.csv suivant. Crée-le dans ton dossier personnel avec nano livraisons.csv pour vérifier tes réponses.
id;date;ville;statut
1041;2026-11-02;Lyon;livré
1042;2026-11-02;Villeurbanne;livré
1043;2026-11-02;Lyon;en cours
1044;2026-11-03;Vénissieux;incident
1045;2026-11-03;Lyon;livré
1046;2026-11-03;Villeurbanne;en cours
1047;2026-11-03;Bron;livré
1048;2026-11-04;Lyon;incident
Exercice 1 sur 4 Chemins absolus et relatifs Réussi À revoir
Tu es dans /var/log/nginx. Donne le dossier où tu arrives après chaque commande, chacune partant de /var/log/nginx :
cd ..cd ../../libcd /etc/nginx/sites-availablecd ~cd ./../apt
Voir la réponseMasquer la réponse de l'exercice 1
/var/log/var/lib:..mène à/var/log, le second..à/var, puislib./etc/nginx/sites-available: un chemin absolu ne dépend pas du dossier courant.- Ton dossier personnel, par exemple
/home/clambert. /var/log/apt:.est le dossier courant,..son parent/var/log, puisapt.
Tu avais trouvé ?
Exercice 2 sur 4 Lire le résultat d'un tube Réussi À revoir
Sans les exécuter, donne le résultat de chaque commande sur livraisons.csv.
wc -l livraisons.csvgrep -c "livré" livraisons.csvgrep incident livraisons.csv | cut -d';' -f1,3tail -n +2 livraisons.csv | cut -d';' -f4 | sort -u
Voir la réponseMasquer la réponse de l'exercice 2
9 livraisons.csv: huit livraisons plus la ligne d'en-tête.4: les lignes 1041, 1042, 1045 et 1047.- Deux lignes, le numéro et la ville :
1044;Vénissieux 1048;Lyon tail -n +2commence à la ligne 2 (il saute l'en-tête) ; on garde le 4e champ et on trie sans doublons :en cours incident livré
Tu avais trouvé ?
Exercice 3 sur 4 Compter les livraisons par ville Réussi À revoir
Écris la commande qui affiche le nombre de livraisons par ville, de la ville la plus servie à la moins servie, sans compter l'en-tête. Donne aussi le résultat.
Voir la réponseMasquer la réponse de l'exercice 3
tail -n +2 livraisons.csv | cut -d';' -f3 | sort | uniq -c | sort -rn
4 Lyon
2 Villeurbanne
1 Vénissieux
1 Bron
Le premier sort est indispensable : uniq -c ne regroupe que les lignes identiques qui se suivent. Sans lui, Lyon apparaîtrait plusieurs fois. Le second sort -rn trie par nombre décroissant ; à égalité, il range les lignes en ordre alphabétique inverse, d'où Vénissieux avant Bron.
Tu avais trouvé ?
Exercice 4 sur 4 Rediriger correctement Réussi À revoir
Pour chaque besoin, écris la commande :
- Enregistrer la liste détaillée de
/etc/nginxdans~/inventaire.txt, en remplaçant le contenu éventuel. - Ajouter à la fin du même fichier la liste de
/etc/ssh. - Chercher tous les fichiers nommés
*.confsous/etcsans afficher les messages « Permission non accordée ». - Ajouter la ligne
192.168.10.180 srv-journauxà la fin de/etc/hosts, qui appartient àroot.
Voir la réponseMasquer la réponse de l'exercice 4
ls -l /etc/nginx > ~/inventaire.txtls -l /etc/ssh >> ~/inventaire.txtfind /etc -name "*.conf" 2> /dev/null: les messages d'erreur partent sur la sortie d'erreur (2), qu'on jette.echo "192.168.10.180 srv-journaux" | sudo tee -a /etc/hosts. La formesudo echo … >> /etc/hostséchoue, car la redirection est faite par ton shell sans privilège.
Tu avais trouvé ?