Comment lire cette note
Le contenu du cours est conservé tel quel. Mes ajouts sont dans des encadrés : compléments, mises en garde, et une évaluation honnête de ma réponse.
Voir aussi : Jour 1 : flux et redirections
Énoncé
Exercice : 100% en ligne de commande, sans même utiliser un éditeur de texte.
Créez une hiérarchie de fichiers adaptée à vos enseignements contenant a minima :
- Un dossier par cours pour ce semestre (noms libres)
- Pour ce cours :
- un fichier
liens_utiles.mdqui contient les liens vers les pads - une copie du pad d'hier au format
.md. Vérifier son contenu et ajouter la ligneFin !à la fin du fichier - des dossiers
TP1TP2TP3TP4TP5
- un fichier
- Dans le home, créer un dossier
backupcontenant une copie de cette hiérarchie - Créer une archive zip contenant le dossier
backup - Déplacer cette archive sur le Bureau
- La détruire
- Recommencer l'opération une deuxième fois
Conseils du prof
- Lister les commandes nécessaires pour chaque étape. Vous ne connaissez peut-être pas toutes les commandes : poser une question sur Zulip.
- Essayer d'optimiser les commandes utilisées.
Ma réponse (liste de commandes)
Ce que j'avais répondu
| Étape | Commandes listées |
|---|---|
| 1 | mkdir, cd |
| 2 | touch, cp, cat, echo, wget, mkdir |
| 3 | mkdir, mv |
| 4 | zip |
| 5 | mv |
| 6 | rm |
Évaluation honnête de cette réponse
Les commandes sont les bonnes. Le problème n'est pas là : la moitié d'entre elles échouera telle quelle, parce qu'il manque les options qui les rendent capables de travailler sur des dossiers.
C'est un point de fond, pas un détail. Sous Unix, beaucoup de commandes refusent par défaut de toucher à un répertoire. C'est une protection : un dossier peut contenir des milliers de fichiers, et une commande destructrice lancée par erreur dessus ferait des dégâts irréversibles. Le système exige donc que tu dises explicitement "oui, je sais que c'est un dossier, descends dedans".
Ce mot-clé est récursif (recursive) : appliquer l'opération au dossier, puis à tout ce qu'il contient, puis à tout ce que ça contient, et ainsi de suite jusqu'au bout.
| Ta commande | Ce qu'il faut réellement | Sans l'option |
|---|---|---|
cp | cp -r (ou mieux, cp -a) | cp: -r not specified; omitting directory |
zip | zip -r | crée une archive vide ou presque |
rm sur un dossier | rm -r | rm: cannot remove: Is a directory |
mv | mv (pas d'option) | fonctionne déjà sur les dossiers |
mv est l'exception : déplacer un dossier ne fait que changer une entrée dans la table du système de fichiers, sans toucher au contenu. C'est pour ça qu'un mv est instantané même sur 50 Go, alors qu'un cp peut prendre plusieurs minutes.
Solution complète, étape par étape
Dérouler la solution
# --- Étape 1 : la hiérarchie des cours -------------------------------
mkdir -p ~/Cours/{pdm,algo,maths,anglais}
cd ~/Cours/pdm
# --- Étape 2 : le contenu du dossier pdm ------------------------------
mkdir TP{1..5}
echo "# Liens utiles - Pratique des machines" > liens_utiles.md
echo "- Jour 1 : https://pads.up8.edu/ADRESSE-DU-PAD" >> liens_utiles.md
echo "- Jour 2 : https://pads.up8.edu/ADRESSE-DU-PAD" >> liens_utiles.md
curl -L -o jour1.md "https://pads.up8.edu/ADRESSE-DU-PAD/download"
less jour1.md # vérifier le contenu (q pour quitter)
echo "Fin !" >> jour1.md
tail -n 3 jour1.md # vérifier que la ligne est bien à la fin
# --- Étape 3 : la copie de sauvegarde ---------------------------------
mkdir -p ~/backup
cp -a ~/Cours ~/backup/
# --- Étape 4 : l'archive ----------------------------------------------
cd ~
zip -r backup.zip backup/
unzip -l backup.zip # lister le contenu SANS extraire : toujours vérifier
# --- Étape 5 : déplacer sur le Bureau ---------------------------------
mv backup.zip "$(xdg-user-dir DESKTOP)"
# --- Étape 6 : détruire -----------------------------------------------
rm "$(xdg-user-dir DESKTOP)/backup.zip"Les quatre pièges de cet exercice
Piège 1 - l'expansion d'accolades
mkdir TP{1..5}Cette syntaxe s'appelle l'expansion d'accolades (brace expansion). Le shell la remplace avant d'exécuter la commande : mkdir TP{1..5} devient littéralement mkdir TP1 TP2 TP3 TP4 TP5.
Pour t'en convaincre, préfixe par echo pour voir ce que le shell fabrique :
echo TP{1..5}
echo ~/Cours/{pdm,algo,maths}Ce réflexe vaut de l'or. Devant une commande destructrice dont tu n'es pas sûr, mets echo devant : tu vois exactement ce qui allait s'exécuter, sans rien casser. C'est la ceinture de sécurité du shell.
L'option -p de mkdir (parents) crée les dossiers parents manquants et ne râle pas si le dossier existe déjà. Indispensable dans un script.
Piège 2 - cp -r contre cp -a
Les deux copient un dossier. La différence est invisible à l'affichage et fondamentale pour une sauvegarde.
| Option | Nom | Ce qui est préservé |
|---|---|---|
-r | recursive | l'arborescence et le contenu des fichiers |
-a | archive | tout ça plus les permissions, les dates, les propriétaires, les liens symboliques |
Avec cp -r, tous tes fichiers copiés prennent la date d'aujourd'hui et les permissions par défaut. Ta « sauvegarde » a donc perdu une partie de l'information. Ce n'est pas grave pour des notes de cours, ça l'est pour un vrai backup système.
cp -a équivaut à cp -dR --preserve=all. Retiens simplement : pour sauvegarder, -a. Pour dupliquer vite fait, -r.
Piège 3 - où est le Bureau ?
Sur ta Debian en français, le dossier s'appelle ~/Bureau. Sur un système en anglais, ~/Desktop. Un script qui code en dur l'un ou l'autre casse dès qu'il change de machine.
La bonne façon interroge la configuration du système :
xdg-user-dir DESKTOPCes chemins sont définis dans ~/.config/user-dirs.dirs. Va le lire :
cat ~/.config/user-dirs.dirsLes guillemets autour de "$(xdg-user-dir DESKTOP)" ne sont pas décoratifs : si le chemin contenait une espace, le shell découperait le résultat en deux arguments et la commande échouerait. Prends l'habitude d'entourer de guillemets toute variable qui contient un chemin. C'est la source de bug numéro un des scripts bash, et aussi une porte d'entrée classique en sécurité.
Piège 4 - rm ne pardonne pas
Il n'y a pas de corbeille en ligne de commande. rm détruit immédiatement et définitivement. Les données restent physiquement sur le disque un moment, mais les récupérer demande des outils de forensique et le résultat est incertain.
Trois réflexes à prendre dès maintenant :
lsavantrm. Lance d'abordlsavec exactement les mêmes arguments. Ce quelsaffiche est précisément ce quermva détruire.rm -idemande confirmation fichier par fichier. Pénible, mais utile au début.- Jamais d'espace parasite.
rm -r ~/ backupau lieu derm -r ~/backupefface ton dossier personnel entier. Une seule espace.
Et bien sûr : ne tape jamais rm -rf / ni rm -rf /*, même « pour voir ».
Compléments
Vérifier une archive avant de s'y fier
Une archive que tu n'as jamais ouverte n'est pas une sauvegarde, c'est une supposition. Deux commandes qui listent sans extraire :
unzip -l backup.zip # pour un .zip
tar -tvf backup.tar.gz # pour un .tar.gzFais-le systématiquement. Le jour où tu restaures, il est trop tard pour découvrir que l'archive était vide.
zip contre tar.gz : pourquoi Linux préfère tar
Le cours demande du zip parce que c'est universel et que Windows l'ouvre nativement. Dans le monde Unix, la norme est plutôt tar.gz.
Raison historique intéressante : tar (tape archive) ne sait que coller des fichiers bout à bout en préservant toutes leurs métadonnées Unix. Il ne compresse rien. gzip ne sait que compresser un flux. On les combine :
tar -czvf backup.tar.gz backup/| Lettre | Signification |
|---|---|
c | create, créer l'archive |
z | passer le résultat dans gzip |
v | verbose, afficher ce qui se passe |
f | le nom de fichier qui suit |
Pour extraire, c devient x (extract) : tar -xzvf backup.tar.gz.
Tu reconnais le principe du pipe du Jour 1 : deux outils qui font une seule chose chacun, assemblés. C'est encore la philosophie Unix.
Ce que ferait un vrai backup
cp -a recopie tout à chaque fois. Sur des notes de cours, sans importance. Sur des dizaines de Go, c'est absurde. L'outil standard est rsync, qui ne transfère que ce qui a changé :
rsync -av --delete ~/Cours/ ~/backup/Cours/Tu le croiseras partout en administration système. Pas la peine de l'apprendre maintenant, mais sache qu'il existe.
Auto-test
- Pourquoi
cprefuse-t-il de copier un dossier sans option, alors quemvaccepte ? - Que devient
mkdir ~/Cours/{pdm,algo}après expansion par le shell ? Comment le vérifier sans rien créer ? - Quelle différence concrète entre
cp -retcp -apour une sauvegarde ? - Pourquoi coder
~/Bureauen dur dans un script est-il une mauvaise idée ? - Quelle commande liste le contenu d'un
.zipsans l'extraire, et pourquoi le faire systématiquement ? - Que détruit exactement
rm -r ~/ backupet en quoi diffère-t-il derm -r ~/backup?