{
  "chapter": {
    "id": "shell-unix",
    "level": "premiere",
    "theme": "Architectures",
    "title": "Shell Unix et commandes",
    "description": "Ligne de commande Unix : navigation dans\nl'arborescence (`ls`, `cd`, `pwd`), manipulation des\nfichiers (`cp`, `mv`, `rm`, `mkdir`), affichage\n(`cat`, `less`), recherche (`grep`, `find`),\nredirections et tubes, droits d'accès.",
    "parties": [
      {
        "id": "arborescence",
        "title": "Se déplacer dans l'arborescence"
      },
      {
        "id": "fichiers",
        "title": "Manipuler fichiers et dossiers"
      },
      {
        "id": "redirections",
        "title": "Redirections, tubes et filtres"
      }
    ],
    "prerequisites": [],
    "references": []
  },
  "questions": [
    {
      "id": "q01",
      "difficulty": 1,
      "skills": [
        "pwd"
      ],
      "title": "Dossier courant",
      "partie": "arborescence",
      "statement": "Quelle commande affiche le **chemin du dossier courant** ?",
      "options": [
        {
          "text": "`where`",
          "correct": false,
          "feedback": "Aucune commande `where`\nn'existe dans le standard\nUnix pour cet usage.\n"
        },
        {
          "text": "`pwd`",
          "correct": true,
          "feedback": "Bonne réponse : `pwd` (print working\ndirectory) affiche le chemin absolu du\ndossier où l'on se trouve.\n"
        },
        {
          "text": "`cd`",
          "correct": false,
          "feedback": "La commande `cd` permet de\nchanger de dossier, mais\nn'affiche pas le chemin\ncourant.\n"
        },
        {
          "text": "`ls`",
          "correct": false,
          "feedback": "La commande `ls` liste le\ncontenu d'un dossier, mais\nn'affiche pas son chemin\nd'accès.\n"
        }
      ],
      "explanation": "Réflexe utile : `pwd` quand on est perdu\ndans l'arborescence. La plupart des shells\nl'affichent dans l'invite (« prompt »)."
    },
    {
      "id": "q02",
      "difficulty": 1,
      "skills": [
        "ls"
      ],
      "title": "Lister",
      "partie": "arborescence",
      "statement": "Quelle commande affiche la **liste des fichiers**\nd'un dossier ?",
      "options": [
        {
          "text": "`dir`",
          "correct": false,
          "feedback": "Existe sur Windows (DOS), parfois sur\nLinux comme alias, mais le standard\nUnix est `ls`.\n"
        },
        {
          "text": "`ls`",
          "correct": true,
          "feedback": "Bonne réponse : `ls` (list) affiche le\ncontenu du dossier courant. Options :\n`-l` (détaillé), `-a` (cachés), `-h`\n(tailles lisibles).\n"
        },
        {
          "text": "`show`",
          "correct": false,
          "feedback": "Cette commande n'est pas\nstandard sur les systèmes\nUnix.\n"
        },
        {
          "text": "`list`",
          "correct": false,
          "feedback": "Cette commande n'est pas\nstandard sur les systèmes\nUnix. La commande\nconsacrée est `ls`.\n"
        }
      ],
      "explanation": "Avec des options : `ls -lh`\ndonne un affichage détaillé,\navec des tailles lisibles.\nPour révéler les fichiers\ncachés (dont le nom commence\npar un point), on utilise\nl'option `-a`. L'idiome\n`ls -la` est l'un des plus\nutiles à connaître."
    },
    {
      "id": "q03",
      "difficulty": 1,
      "skills": [
        "cd"
      ],
      "title": "Changer de dossier",
      "partie": "arborescence",
      "statement": "Quelle commande **change** de dossier ?",
      "options": [
        {
          "text": "`open`",
          "correct": false,
          "feedback": "Sur macOS, `open` lance une application,\npas un changement de dossier.\n"
        },
        {
          "text": "`enter`",
          "correct": false,
          "feedback": "Aucune commande `enter`\nstandard n'existe sous\nUnix pour cet usage.\n"
        },
        {
          "text": "`cd`",
          "correct": true,
          "feedback": "Bonne réponse : `cd` (change directory)\nsuivi du chemin. Sans paramètre :\nrevient au dossier personnel\n(`/home/user`). `cd ..` : remonte d'un\nniveau.\n"
        },
        {
          "text": "`go`",
          "correct": false,
          "feedback": "Aucune commande `go`\nstandard ne permet de\nchanger de dossier sous\nUnix.\n"
        }
      ],
      "explanation": "Astuces : `cd -` revient au dossier\nprécédent ; `cd ~` va au dossier\npersonnel ; `cd /` à la racine du système\nde fichiers."
    },
    {
      "id": "q04",
      "difficulty": 1,
      "skills": [
        "mkdir"
      ],
      "title": "Créer un dossier",
      "partie": "fichiers",
      "statement": "Quelle commande **crée un dossier** ?",
      "options": [
        {
          "text": "`md`",
          "correct": false,
          "feedback": "Sur Windows, oui. Sur Unix, c'est\n`mkdir`.\n"
        },
        {
          "text": "`new`",
          "correct": false,
          "feedback": "Aucune commande `new`\nstandard ne crée un\ndossier sous Unix.\n"
        },
        {
          "text": "`createdir`",
          "correct": false,
          "feedback": "Cette commande n'est pas\nstandard sous Unix. La\ncommande consacrée est\n`mkdir`.\n"
        },
        {
          "text": "`mkdir`",
          "correct": true,
          "feedback": "Bonne réponse : `mkdir` (make\ndirectory) suivi du nom du dossier.\nOption `-p` : crée les dossiers\nintermédiaires si nécessaire.\n"
        }
      ],
      "explanation": "Pour créer une arborescence en une fois :\n`mkdir -p projet/src/utils`. Crée tous les\ndossiers nécessaires."
    },
    {
      "id": "q05",
      "difficulty": 1,
      "skills": [
        "cp"
      ],
      "title": "Copier",
      "partie": "fichiers",
      "statement": "Quelle commande **copie** un fichier ?",
      "options": [
        {
          "text": "`copy`",
          "correct": false,
          "feedback": "Existe sur Windows. Sur Unix, c'est\n`cp`.\n"
        },
        {
          "text": "`mv`",
          "correct": false,
          "feedback": "La commande `mv` permet de\n**déplacer** ou de\n**renommer** un fichier,\nmais pas de le copier.\n"
        },
        {
          "text": "`cp`",
          "correct": true,
          "feedback": "Bonne réponse : `cp source destination`.\nPour copier un dossier : `cp -r` (récursif).\n"
        },
        {
          "text": "`duplicate`",
          "correct": false,
          "feedback": "Aucune commande `duplicate`\nstandard n'existe sous\nUnix.\n"
        }
      ],
      "explanation": "Très utilisé : `cp -r dossier1 dossier2`\ncopie tout l'arbre. `cp -i` demande\nconfirmation avant d'écraser."
    },
    {
      "id": "q06",
      "difficulty": 1,
      "skills": [
        "mv"
      ],
      "title": "Déplacer / renommer",
      "partie": "fichiers",
      "statement": "Quelle commande **déplace ou renomme** un\nfichier ?",
      "options": [
        {
          "text": "`rename`",
          "correct": false,
          "feedback": "Existe (par exemple en Perl), mais le\nstandard Unix est `mv`.\n"
        },
        {
          "text": "`move`",
          "correct": false,
          "feedback": "Existe sur Windows. Sur Unix, `mv`.\n"
        },
        {
          "text": "`mv`",
          "correct": true,
          "feedback": "Bonne réponse : `mv source destination`.\nSi la destination est dans le même\ndossier avec un nom différent, c'est\nun renommage.\n"
        },
        {
          "text": "`change`",
          "correct": false,
          "feedback": "Aucune commande `change`\nstandard ne déplace ou ne\nrenomme un fichier sous\nUnix.\n"
        }
      ],
      "explanation": "Renommer : `mv ancien.txt nouveau.txt`. Déplacer : `mv fichier.txt /home/alice/`."
    },
    {
      "id": "q07",
      "difficulty": 1,
      "skills": [
        "rm"
      ],
      "title": "Supprimer",
      "partie": "fichiers",
      "statement": "Quelle commande **supprime** un fichier ?",
      "options": [
        {
          "text": "`delete`",
          "correct": false,
          "feedback": "Aucune commande `delete`\nstandard ne supprime un\nfichier sous Unix.\n"
        },
        {
          "text": "`rm`",
          "correct": true,
          "feedback": "Bonne réponse : `rm fichier.txt`.\n**Attention** : pas de corbeille en\nligne de commande, suppression\n**définitive**.\n"
        },
        {
          "text": "`erase`",
          "correct": false,
          "feedback": "Aucune commande `erase`\nstandard ne supprime un\nfichier sous Unix.\n"
        },
        {
          "text": "`rmdir`",
          "correct": false,
          "feedback": "Erreur : `rmdir` ne supprime qu'un dossier\n**vide** ; sur un fichier, il répond\n« Not a directory » et ne supprime rien.\n"
        }
      ],
      "explanation": "`rm -r dossier` supprime un dossier (et\ntout son contenu). `rm -rf /` est la\ncommande la plus dangereuse possible :\ndétruit tout le système."
    },
    {
      "id": "q08",
      "difficulty": 1,
      "skills": [
        "cat"
      ],
      "title": "Afficher un fichier",
      "partie": "fichiers",
      "statement": "Quelle commande **affiche le contenu** d'un\nfichier texte ?",
      "options": [
        {
          "text": "`read`",
          "correct": false,
          "feedback": "Existe mais lit l'entrée standard,\npas un fichier.\n"
        },
        {
          "text": "`cat`",
          "correct": true,
          "feedback": "Bonne réponse : `cat fichier.txt`\naffiche tout le contenu d'un coup.\nPour les gros fichiers, préférer\n`less` (page par page).\n"
        },
        {
          "text": "`show`",
          "correct": false,
          "feedback": "Aucune commande `show`\nstandard n'affiche le\ncontenu d'un fichier sous\nUnix.\n"
        },
        {
          "text": "`open`",
          "correct": false,
          "feedback": "Sur macOS, `open` lance l'application\nassociée, pas le shell.\n"
        }
      ],
      "explanation": "`cat` (concatenate) : affiche **et**\nconcatène plusieurs fichiers\n(`cat a.txt b.txt`). Variantes : `head`\n(début), `tail` (fin), `tac` (à l'envers)."
    },
    {
      "id": "q09",
      "difficulty": 1,
      "skills": [
        "chemin"
      ],
      "title": "Chemins",
      "partie": "arborescence",
      "statement": "Que désignent `.` et `..` dans un chemin ?",
      "options": [
        {
          "text": "Des messages d'erreur affichés par le système",
          "correct": false,
          "feedback": "Au contraire, ce sont des\nentrées normales et\nparfaitement valides du\nsystème de fichiers.\n"
        },
        {
          "text": "`.` = dossier courant ; `..` = dossier parent",
          "correct": true,
          "feedback": "Bonne réponse : permettent les chemins\nrelatifs. `./script.sh` exécute le\nscript du dossier courant.\n`../fichier` désigne le fichier dans le\ndossier parent.\n"
        },
        {
          "text": "Des fichiers cachés du système",
          "correct": false,
          "feedback": "Cette interprétation est\nimprécise : les notations\n`.` et `..` ne désignent\npas des fichiers cachés\nau sens classique du\nterme, mais des\nréférences particulières\ndans l'arborescence.\n"
        },
        {
          "text": "Des séparateurs de chemin",
          "correct": false,
          "feedback": "Le caractère qui sépare\nles éléments d'un chemin\nest `/`, et non le point.\n"
        }
      ],
      "explanation": "Tous les dossiers possèdent ces deux\nentrées spéciales (à la racine `/`, les\ndeux désignent la racine elle-même).\n`cd ..` remonte ; `./script.sh` permet\nd'exécuter un script du dossier courant,\ncar ce dossier ne figure pas dans le\nPATH."
    },
    {
      "id": "q10",
      "difficulty": 1,
      "skills": [
        "help"
      ],
      "title": "Aide d'une commande",
      "partie": "arborescence",
      "statement": "Comment **afficher l'aide** d'une commande\nUnix ?",
      "options": [
        {
          "text": "`info commande`",
          "correct": false,
          "feedback": "Existe sur certains systèmes (GNU\ninfo), plus complet que `man` mais\nmoins universel.\n"
        },
        {
          "text": "`commande --aide`",
          "correct": false,
          "feedback": "Existe avec `--help` (en anglais), mais\nce n'est qu'un résumé court.\n"
        },
        {
          "text": "`help commande`",
          "correct": false,
          "feedback": "Existe pour les commandes intégrées au\nshell (Bash), mais le standard est\n`man`.\n"
        },
        {
          "text": "`man commande`",
          "correct": true,
          "feedback": "Bonne réponse : `man` (manual) ouvre\nla page de manuel, par exemple `man ls`.\nNavigation : flèches, `/` pour\nrechercher, `q` pour quitter.\n"
        }
      ],
      "explanation": "`man ls` ou `ls --help` : selon le\ncontexte. Pour rechercher : `man -k mot`.\nApprendre à lire le `man` est essentiel\npour devenir autonome."
    },
    {
      "id": "q11",
      "difficulty": 2,
      "skills": [
        "redirection"
      ],
      "title": "Redirection sortie",
      "partie": "redirections",
      "statement": "Que fait `ls > liste.txt` ?",
      "options": [
        {
          "text": "Elle affiche simplement le contenu actuel de `liste.txt`",
          "correct": false,
          "feedback": "C'est précisément\nl'inverse : on écrit\ndans `liste.txt`, on n'en\nlit pas le contenu.\n"
        },
        {
          "text": "Redirige la sortie de `ls` vers `liste.txt` au lieu de l'afficher",
          "correct": true,
          "feedback": "Bonne réponse : `>` redirige la sortie\nstandard. Pour **ajouter** sans\nécraser : `>>`.\n"
        },
        {
          "text": "Elle compare la sortie de `ls` au contenu de `liste.txt`",
          "correct": false,
          "feedback": "Aucune comparaison n'est\nréalisée. L'opérateur `>`\nsert à rediriger une\nsortie, et non à\ncomparer.\n"
        },
        {
          "text": "Elle renomme la commande `ls` en `liste.txt`",
          "correct": false,
          "feedback": "Aucun renommage n'a lieu.\nLa commande `ls` reste\ninchangée ; seul son\nrésultat est redirigé\nvers le fichier.\n"
        }
      ],
      "explanation": "Redirections : `>` (sortie),\n`>>` (sortie ajoutée), `<` (entrée),\n`2>` (erreur). Ex. : `ls > out.txt\n2> err.txt` sépare sortie et erreurs."
    },
    {
      "id": "q12",
      "difficulty": 2,
      "skills": [
        "pipe"
      ],
      "title": "Pipe",
      "partie": "redirections",
      "statement": "Que fait le caractère `|` (pipe) en shell ?",
      "options": [
        {
          "text": "Il envoie la sortie d'une commande vers l'entrée de la suivante",
          "correct": true,
          "feedback": "Bonne réponse : `ls | grep .txt`\nfiltre la sortie de `ls` pour ne\ngarder que ce qui contient « .txt ».\nTrès puissant pour combiner des\ncommandes simples.\n"
        },
        {
          "text": "Il répète en boucle la commande placée avant lui",
          "correct": false,
          "feedback": "Aucune notion de boucle\nn'est associée à ce\nsymbole dans\nl'interpréteur de\ncommandes.\n"
        },
        {
          "text": "Il introduit un commentaire ignoré par l'interpréteur",
          "correct": false,
          "feedback": "Le caractère qui introduit\nun commentaire dans\nl'interpréteur de\ncommandes est `#`, et\nnon `|`.\n"
        },
        {
          "text": "Il sépare deux commandes exécutées indépendamment l'une de l'autre",
          "correct": false,
          "feedback": "Erreur : c'est le rôle du\npoint-virgule `;`. Avec `|`, les deux\ncommandes sont liées : la seconde lit\nce que la première écrit.\n"
        }
      ],
      "explanation": "Philosophie Unix : « petites commandes\nqui font une seule chose, combinables\npar pipes ». Exemple :\n`cat fichier.log | grep \"error\" | wc -l`\ncompte les lignes contenant « error »."
    },
    {
      "id": "q13",
      "difficulty": 2,
      "skills": [
        "grep"
      ],
      "title": "Recherche dans un fichier",
      "partie": "redirections",
      "statement": "Quelle commande **cherche un motif** dans un\nou plusieurs fichiers ?",
      "options": [
        {
          "text": "`grep`",
          "correct": true,
          "feedback": "Bonne réponse : `grep motif fichier`.\n`grep -r motif dossier/` (récursif).\n`grep -i` (insensible à la casse).\n"
        },
        {
          "text": "`look`",
          "correct": false,
          "feedback": "Existe mais limité aux fichiers triés.\n"
        },
        {
          "text": "`find`",
          "correct": false,
          "feedback": "Erreur : `find` cherche des **fichiers**\ndans l'arborescence.\n"
        },
        {
          "text": "`search`",
          "correct": false,
          "feedback": "Erreur : pas standard.\n"
        }
      ],
      "explanation": "`grep` recherche un mot dans le contenu d'un ou de plusieurs fichiers et affiche les lignes qui le contiennent."
    },
    {
      "id": "q14",
      "difficulty": 2,
      "skills": [
        "find"
      ],
      "title": "find",
      "partie": "fichiers",
      "statement": "Quelle commande **trouve des fichiers** dans\nl'arborescence selon des critères (nom,\ntaille, date) ?",
      "options": [
        {
          "text": "`find`",
          "correct": true,
          "feedback": "Bonne réponse : `find . -name \"*.txt\"`\ntrouve tous les .txt à partir du\ndossier courant. Très puissant et\nflexible.\n"
        },
        {
          "text": "`locate`",
          "correct": false,
          "feedback": "Existe (utilise une base indexée), mais\nla commande standard est `find`.\n"
        },
        {
          "text": "`grep`",
          "correct": false,
          "feedback": "Erreur : `grep` cherche dans le contenu.\n"
        },
        {
          "text": "`look`",
          "correct": false,
          "feedback": "Erreur : pas pour ça.\n"
        }
      ],
      "explanation": "`find` parcourt récursivement et applique\ndes actions : afficher, supprimer,\nexécuter une commande sur chaque résultat.\nTrès puissant."
    },
    {
      "id": "q15",
      "difficulty": 2,
      "skills": [
        "permission-chmod"
      ],
      "title": "chmod",
      "partie": "fichiers",
      "statement": "Que fait `chmod +x script.sh` ?",
      "options": [
        {
          "text": "Renomme le fichier en ajoutant un suffixe `x` à son nom",
          "correct": false,
          "feedback": "Erreur : le renommage se fait avec `mv`,\net `chmod` ne touche jamais au nom.\n"
        },
        {
          "text": "Ajoute la permission d'exécution au fichier",
          "correct": true,
          "feedback": "Bonne réponse : `chmod` change les\npermissions. `+x` ajoute le bit\nd'exécution. Indispensable pour les\nscripts.\n"
        },
        {
          "text": "Rend le fichier invisible dans les listages de `ls`",
          "correct": false,
          "feedback": "Sous Unix, masquer un\nfichier consiste à\npréfixer son nom par\nun point (par exemple\n`.fichier`). La commande\n`chmod` ne touche pas\nau nom, elle modifie\nles droits d'accès.\n"
        },
        {
          "text": "Supprime le fichier après confirmation",
          "correct": false,
          "feedback": "Erreur : la suppression se fait avec\n`rm` ; `chmod` ne détruit jamais rien.\n"
        }
      ],
      "explanation": "Sans `+x`, on ne peut pas faire\n`./script.sh`. Trois bits par catégorie\n(utilisateur, groupe, autres) : r (lecture),\nw (écriture), x (exécution)."
    },
    {
      "id": "q17",
      "difficulty": 2,
      "skills": [
        "wc"
      ],
      "title": "Compter",
      "partie": "redirections",
      "statement": "Quelle commande **compte** les lignes, mots et\ncaractères d'un fichier ?",
      "options": [
        {
          "text": "`length`",
          "correct": false,
          "feedback": "Erreur : pas standard.\n"
        },
        {
          "text": "`cnt`",
          "correct": false,
          "feedback": "Erreur : pas standard.\n"
        },
        {
          "text": "`count`",
          "correct": false,
          "feedback": "Erreur : pas standard.\n"
        },
        {
          "text": "`wc`",
          "correct": true,
          "feedback": "Bonne réponse : `wc` (word count).\nOptions : `-l` (lignes), `-w` (mots),\n`-c` (octets), `-m` (caractères).\n"
        }
      ],
      "explanation": "Idiome utile : `cat fichier | wc -l`\n(compter les lignes), ou plus\ndirectement `wc -l fichier`. Très utilisé\ndans des pipelines."
    },
    {
      "id": "q19",
      "difficulty": 2,
      "skills": [
        "chemins-absolu-relatif"
      ],
      "title": "Chemin absolu vs relatif",
      "partie": "arborescence",
      "statement": "Quelle est la différence entre un chemin\n**absolu** et un chemin **relatif** ?",
      "options": [
        {
          "text": "L'un fonctionne uniquement sur Windows",
          "correct": false,
          "feedback": "Erreur : les deux existent sur tous les\nsystèmes d'exploitation.\n"
        },
        {
          "text": "L'un des deux est nettement plus rapide à utiliser",
          "correct": false,
          "feedback": "Erreur : performance équivalente.\n"
        },
        {
          "text": "L'absolu part de la racine `/`, le relatif du dossier courant",
          "correct": true,
          "feedback": "Bonne réponse : utiliser le bon selon\nle contexte. Le relatif est plus court\nmais ambigu hors contexte. L'absolu est\nrobuste mais long.\n"
        },
        {
          "text": "Aucune, les deux notations sont interchangeables partout",
          "correct": false,
          "feedback": "Erreur : la différence est fondamentale,\nun chemin relatif change de cible selon\nle dossier courant.\n"
        }
      ],
      "explanation": "Mnémonique : « absolu = depuis la\nracine » ; « relatif = depuis ici ».\nBonne pratique dans les scripts :\nprivilégier les chemins absolus pour\néviter les surprises."
    },
    {
      "id": "q20",
      "difficulty": 2,
      "skills": [
        "cat",
        "redirection"
      ],
      "title": "Réunir deux fichiers avec cat",
      "partie": "fichiers",
      "statement": "Le fichier `debut.txt` contient la ligne `Bonjour` et le fichier `fin.txt` la ligne `Au revoir`. Que contient `complet.txt` après la commande suivante ?\n```bash\ncat debut.txt fin.txt > complet.txt\n```",
      "options": [
        {
          "text": "Seulement `Au revoir`, le second fichier remplaçant le premier",
          "correct": false,
          "feedback": "Erreur : `cat` affiche ses fichiers l'un après l'autre, dans une seule sortie. La redirection `>` écrit cette sortie entière dans `complet.txt`, sans rien écraser entre les deux.\n"
        },
        {
          "text": "`Bonjour` puis `Au revoir`, sur deux lignes",
          "correct": true,
          "feedback": "Bonne réponse : `cat` enchaîne le contenu de `debut.txt` puis celui de `fin.txt`, et `>` envoie le tout dans `complet.txt` au lieu de l'afficher à l'écran.\n"
        },
        {
          "text": "Rien, `cat` n'écrivant qu'à l'écran",
          "correct": false,
          "feedback": "Erreur : sans redirection, `cat` écrit à l'écran ; avec `>`, ce même texte est envoyé dans le fichier nommé, qui est créé s'il n'existe pas.\n"
        },
        {
          "text": "Les noms `debut.txt` et `fin.txt`",
          "correct": false,
          "feedback": "Erreur : `cat` n'écrit pas les noms des fichiers qu'on lui donne, mais leur contenu. C'est ce contenu qui se retrouve dans `complet.txt`.\n"
        }
      ],
      "explanation": "`cat` affiche le contenu de ses fichiers dans l'ordre où on les donne. Suivie de `> fichier`, la commande écrit ce contenu dans un fichier : c'est une façon simple de réunir plusieurs fichiers texte en un seul."
    },
    {
      "id": "q22",
      "difficulty": 3,
      "skills": [
        "chmod-octal"
      ],
      "title": "Permissions octales",
      "partie": "fichiers",
      "statement": "Que représente `chmod 755 script.sh` ?",
      "options": [
        {
          "text": "Des permissions codées en octal pour trois catégories d'utilisateurs",
          "correct": true,
          "feedback": "Bonne réponse : notation **octale**\ndes permissions Unix (4 = read, 2 =\nwrite, 1 = execute) : propriétaire\n`rwx` (7), groupe `r-x` (5), autres\n`r-x` (5).\n"
        },
        {
          "text": "L'identifiant du processus qui exécutera le script",
          "correct": false,
          "feedback": "Un identifiant de processus\n(PID) est attribué au\nlancement du programme,\nil n'a rien à voir avec\n`chmod`, qui modifie\nseulement les droits\nd'accès au fichier.\n"
        },
        {
          "text": "Une simple erreur de syntaxe de la commande",
          "correct": false,
          "feedback": "Erreur : syntaxe valide.\n"
        },
        {
          "text": "La nouvelle taille du fichier exprimée en octets",
          "correct": false,
          "feedback": "La commande `chmod` ne\ntouche jamais à la taille\ndu fichier. Elle ne modifie\nque les permissions, ici\nencodées en notation\noctale.\n"
        }
      ],
      "explanation": "Modes courants : 755 (exécutable\nlisible), 644 (fichier texte normal),\n700 (privé). À la place de la notation\noctale : `chmod u=rwx,go=rx script.sh`."
    },
    {
      "id": "q25",
      "difficulty": 3,
      "skills": [
        "synthese"
      ],
      "title": "Synthèse",
      "partie": "redirections",
      "statement": "Parmi les affirmations suivantes sur le shell\nUnix, laquelle est **fausse** ?",
      "options": [
        {
          "text": "`grep` cherche un motif dans le contenu de fichiers",
          "correct": false,
          "feedback": "C'est exactement le\nrôle de `grep`. Cette\naffirmation est donc\njuste, et n'est pas\nla mauvaise réponse\nattendue dans cette\nquestion.\n"
        },
        {
          "text": "`rm` met les fichiers dans une corbeille récupérable par défaut",
          "correct": true,
          "feedback": "Faux (donc bonne réponse) : `rm`\nsupprime **définitivement** sans\ncorbeille en ligne de commande. La\ncorbeille est une notion graphique\n(gérée par l'environnement de bureau).\n"
        },
        {
          "text": "`pwd` affiche le chemin du dossier courant",
          "correct": false,
          "feedback": "Cette affirmation est\nexacte : `pwd` (*print\nworking directory*)\nrenvoie effectivement\nle chemin absolu du\ndossier courant. Ce\nn'est donc pas la\nmauvaise affirmation\nrecherchée.\n"
        },
        {
          "text": "`|` permet de chaîner des commandes en redirigeant la sortie de l'une vers l'entrée de l'autre",
          "correct": false,
          "feedback": "Vrai : un des concepts les plus\npuissants d'Unix.\n"
        }
      ],
      "explanation": "Important : `rm` est définitif. Toujours vérifier deux fois la commande avant de la lancer."
    },
    {
      "id": "q26",
      "difficulty": 1,
      "skills": [
        "chemin",
        "home"
      ],
      "title": "Le caractère « tilde »",
      "partie": "arborescence",
      "statement": "Dans un terminal Unix, à quoi correspond le caractère\n`~` (tilde) en début de chemin ?",
      "options": [
        {
          "text": "Au répertoire parent, situé juste au-dessus",
          "correct": false,
          "feedback": "Erreur : le répertoire parent se note `..` (deux\npoints). Le tilde n'a aucun rapport avec la\nremontée dans l'arborescence.\n"
        },
        {
          "text": "Au répertoire courant",
          "correct": false,
          "feedback": "Erreur : le répertoire courant est noté `.` (un\npoint). Le tilde renvoie au répertoire personnel,\nquel que soit l'endroit où l'on se trouve.\n"
        },
        {
          "text": "Au répertoire racine du système",
          "correct": false,
          "feedback": "Erreur : la racine se note `/`. Le tilde, lui,\nrenvoie à un répertoire personnel, pas à la\nracine du système.\n"
        },
        {
          "text": "Au répertoire personnel de l'utilisateur courant",
          "correct": true,
          "feedback": "Bonne réponse : `~` est une abréviation pour le\nchemin du répertoire personnel (par exemple\n`/home/eleve` sur Linux ou `/Users/eleve` sur\nmacOS). On peut donc écrire `cd ~/Documents`\nplutôt que le chemin absolu complet.\n"
        }
      ],
      "explanation": "Trois symboles à connaître pour la navigation : `~`\n(répertoire personnel), `.` (répertoire courant) et\n`..` (répertoire parent). On les combine fréquemment :\n`~/projets/.config` désigne le sous-dossier `.config`\ndu dossier `projets` placé dans le répertoire\npersonnel."
    },
    {
      "id": "q27",
      "difficulty": 2,
      "skills": [
        "glob",
        "joker"
      ],
      "title": "Caractère joker",
      "partie": "fichiers",
      "statement": "Dans un terminal, on saisit la commande suivante :\n\n```bash\nls *.txt\n```\n\nQuel est l'effet du caractère `*` ?",
      "options": [
        {
          "text": "Il remplace n'importe quelle suite de caractères dans un nom",
          "correct": true,
          "feedback": "Bonne réponse : avant l'exécution de la commande,\nle shell remplace `*.txt` par la liste de tous\nles fichiers du dossier courant dont le nom\nfinit par `.txt`. C'est le mécanisme appelé\n*globbing*.\n"
        },
        {
          "text": "Il multiplie le résultat de la commande par lui-même",
          "correct": false,
          "feedback": "Erreur : aucune notion d'arithmétique dans une\ncommande `ls`. Le `*` est un caractère générique\npour les noms de fichiers, pas un opérateur de\nmultiplication.\n"
        },
        {
          "text": "Il commente la fin de la ligne, ignorée par le shell",
          "correct": false,
          "feedback": "Erreur : un commentaire dans le shell s'introduit\navec `#` placé en début de ligne. Le caractère\n`*` est un joker pour l'expansion de noms de\nfichiers.\n"
        },
        {
          "text": "Il suspend l'exécution jusqu'à l'appui sur une touche",
          "correct": false,
          "feedback": "Erreur : la commande s'exécute normalement et\nliste bien des fichiers. Le caractère `*` ne\nbloque rien, il est simplement remplacé par les\nnoms qui correspondent au motif.\n"
        }
      ],
      "explanation": "Quelques motifs courants : `*.py` (tous les fichiers\nPython), `image_*.png` (toutes les images\nnumérotées), `*` (tous les fichiers du dossier).\nPlus précis : `?` remplace exactement un caractère\net `[abc]` remplace une lettre choisie dans\nl'ensemble."
    },
    {
      "id": "q28",
      "difficulty": 1,
      "skills": [
        "fichier-cache",
        "ls"
      ],
      "title": "Fichiers cachés",
      "partie": "arborescence",
      "statement": "Sous Unix, à quoi reconnaît-on un fichier ou un\ndossier dit **caché** ?",
      "options": [
        {
          "text": "À un attribut spécial dans le système de fichiers",
          "correct": false,
          "feedback": "Erreur : Unix n'utilise pas d'attribut\n« caché ». La convention est purement basée sur\nle nom : tout fichier dont le nom commence par\nun point est masqué par défaut.\n"
        },
        {
          "text": "À son extension `.hidden`",
          "correct": false,
          "feedback": "Erreur : aucune extension particulière ne marque\nun fichier comme caché. C'est le **préfixe** du\nnom (un point) qui joue ce rôle, pas\nl'extension.\n"
        },
        {
          "text": "À son nom qui commence par un point (par exemple `.bashrc`)",
          "correct": true,
          "feedback": "Bonne réponse : sous Unix, la convention est\nqu'un nom de fichier commençant par `.` n'est pas\naffiché par `ls` ni dans la plupart des\ngestionnaires graphiques. Pour les voir, on\nutilise l'option `ls -a`.\n"
        },
        {
          "text": "À son emplacement dans le dossier `/hidden`",
          "correct": false,
          "feedback": "Erreur : il n'existe pas de dossier réservé pour\nles fichiers cachés sous Unix. La convention est\nbasée sur le nom, pas sur l'emplacement.\n"
        }
      ],
      "explanation": "Cette convention est utilisée pour les fichiers de configuration personnels, comme `.bashrc`, qui doivent rester discrets dans le répertoire personnel. Pour visualiser ces fichiers dans un terminal, on utilise `ls -a`."
    },
    {
      "id": "q29",
      "difficulty": 3,
      "skills": [
        "synthese",
        "pipe",
        "redirection"
      ],
      "title": "Effet d'un enchaînement tube et redirection",
      "partie": "redirections",
      "statement": "Que produit exactement la commande suivante ?\n\n`cat notes.txt | sort -n | head -n 3 > top3.txt`",
      "options": [
        {
          "text": "Elle écrit dans `top3.txt` les trois plus petites valeurs de `notes.txt`",
          "correct": true,
          "feedback": "Bonne réponse : le tube `|` enchaîne `cat` (lecture\ndu fichier), `sort -n` (tri numérique) et `head -n 3`\n(trois premières lignes du flot trié, donc les plus\npetites valeurs). La redirection `>` envoie ce flot\nfinal dans `top3.txt` : rien ne s'affiche dans le\nterminal et `notes.txt` n'est pas modifié.\n"
        },
        {
          "text": "Elle affiche les trois premières lignes de `notes.txt` à l'écran sans modifier les fichiers",
          "correct": false,
          "feedback": "Erreur : sans `sort`, on aurait peut-être pris les\ntrois premières lignes du fichier tel quel, mais le\ntri intervient avant `head`. Et la redirection `>`\nempêche tout affichage à l'écran.\n"
        },
        {
          "text": "Elle supprime les trois premières lignes de `notes.txt`",
          "correct": false,
          "feedback": "Erreur : `head` extrait des lignes mais ne modifie pas\nle fichier source. Aucune commande de suppression\nn'est utilisée ici.\n"
        },
        {
          "text": "Elle crée un fichier `top3.txt` contenant les trois premières lignes de `notes.txt` dans leur ordre d'origine, sans tri",
          "correct": false,
          "feedback": "Erreur : `sort -n` est appliqué avant `head`, donc\nles trois lignes écrites sont les plus petites\nvaleurs, pas les trois premières lignes du fichier\nd'origine.\n"
        }
      ],
      "explanation": "Les tubes `|` chaînent la sortie standard d'une commande\navec l'entrée standard de la suivante : chaque maillon\nfiltre ou transforme le flot. La redirection `>` capture\nenfin ce flot dans un fichier. Cette composition est\nl'un des principes les plus puissants du shell Unix."
    },
    {
      "id": "q30",
      "difficulty": 3,
      "skills": [
        "grep",
        "wc",
        "tube"
      ],
      "title": "Compter les lignes trouvées par grep",
      "partie": "redirections",
      "statement": "Le fichier `villes.txt` indique, pour chaque élève, sa ville de naissance puis sa ville actuelle :\n```text\nAna;Lyon;Lyon\nBob;Paris;Lille\nCléo;Nice;Lyon\nDan;Lens;Paris\n```\nQu'affiche la commande suivante ?\n```bash\ngrep Lyon villes.txt | wc -l\n```",
      "options": [
        {
          "text": "`3`",
          "correct": false,
          "feedback": "Erreur : tu comptes les occurrences du mot `Lyon`, mais `grep` affiche des lignes entières. La ligne d'Ana, où le mot apparaît deux fois, n'est affichée qu'une fois.\n"
        },
        {
          "text": "`4`",
          "correct": false,
          "feedback": "Erreur : `wc -l` ne lit pas `villes.txt`, il compte les lignes que `grep` lui transmet par le tube. Seules les lignes contenant `Lyon` lui parviennent.\n"
        },
        {
          "text": "`1`",
          "correct": false,
          "feedback": "Erreur : `grep` ne s'arrête pas à la première ligne trouvée, il parcourt tout le fichier. Les lignes d'Ana et de Cléo contiennent toutes deux `Lyon`.\n"
        },
        {
          "text": "`2`",
          "correct": true,
          "feedback": "Bonne réponse : `grep` transmet les deux lignes qui contiennent `Lyon`, celles d'Ana et de Cléo, et `wc -l` compte ces deux lignes.\n"
        }
      ],
      "explanation": "Le tube `|` envoie la sortie de la première commande à l'entrée de la seconde. `grep` produit les lignes qui contiennent le mot cherché, une fois chacune, et `wc -l` compte les lignes qu'il reçoit."
    },
    {
      "id": "q31",
      "difficulty": 1,
      "skills": [
        "redirection",
        "ecraser",
        "ajouter"
      ],
      "title": "Écraser ou compléter un fichier",
      "partie": "redirections",
      "statement": "Quelle différence entre `ls > liste.txt` et `ls >> liste.txt` ?",
      "options": [
        {
          "text": "`>` remplace le contenu de `liste.txt`, `>>` ajoute à la fin",
          "correct": true,
          "feedback": "Bonne réponse : la redirection simple écrase le fichier, la\ndouble y ajoute la sortie sans toucher à ce qui s'y trouvait.\n"
        },
        {
          "text": "`>` écrit dans le fichier, `>>` l'affiche à l'écran",
          "correct": false,
          "feedback": "Erreur : les deux écrivent dans le fichier ; rien n'apparaît à\nl'écran.\n"
        },
        {
          "text": "`>>` écrit deux fois la sortie, une par chevron",
          "correct": false,
          "feedback": "Erreur : la sortie n'est écrite qu'une fois, après le contenu\nexistant.\n"
        },
        {
          "text": "Aucune, les deux écritures étant strictement équivalentes",
          "correct": false,
          "feedback": "Erreur : avec `>`, un fichier existant perd son contenu.\n"
        }
      ],
      "explanation": "Choisir `>>` pour tenir un journal qui grandit, `>` pour produire\nun fichier neuf à chaque fois."
    },
    {
      "id": "q32",
      "difficulty": 2,
      "skills": [
        "filtre",
        "head"
      ],
      "title": "Les premières lignes d'un fichier",
      "partie": "redirections",
      "statement": "Que fait la commande `head -n 3 notes.txt` ?",
      "options": [
        {
          "text": "Elle affiche les trois premières lignes du fichier",
          "correct": true,
          "feedback": "Bonne réponse : `head` montre le début d'un fichier, dix lignes\npar défaut, ou le nombre indiqué par `-n`.\n"
        },
        {
          "text": "Elle affiche les trois dernières lignes du fichier",
          "correct": false,
          "feedback": "Erreur : la fin d'un fichier s'affiche avec `tail`.\n"
        },
        {
          "text": "Elle supprime les trois premières lignes du fichier",
          "correct": false,
          "feedback": "Erreur : `head` ne modifie jamais le fichier, elle affiche.\n"
        },
        {
          "text": "Elle affiche les lignes qui contiennent le nombre 3",
          "correct": false,
          "feedback": "Erreur : la recherche d'un motif se fait avec `grep`.\n"
        }
      ],
      "explanation": "`head` et `tail` montrent le début et la fin d'un fichier, pratiques\npour jeter un œil à un gros fichier sans l'afficher en entier."
    },
    {
      "id": "q33",
      "difficulty": 2,
      "skills": [
        "filtre",
        "sort"
      ],
      "title": "Trier les lignes d'un fichier",
      "partie": "redirections",
      "statement": "Le fichier `prenoms.txt` contient `Sami`, `Lina`, `Nora`, une par\nligne. Qu'affiche `sort prenoms.txt` ?",
      "options": [
        {
          "text": "`Lina`, `Nora`, `Sami`, dans l'ordre alphabétique",
          "correct": true,
          "feedback": "Bonne réponse : `sort` affiche les lignes triées, sans modifier\nle fichier.\n"
        },
        {
          "text": "`Sami`, `Lina`, `Nora`, le fichier étant trié sur place",
          "correct": false,
          "feedback": "Erreur : `sort` affiche un résultat trié et laisse le fichier\nintact.\n"
        },
        {
          "text": "Le nombre de lignes du fichier",
          "correct": false,
          "feedback": "Erreur : compter est le rôle de `wc`.\n"
        },
        {
          "text": "`Sami`, `Nora`, `Lina`, dans l'ordre inverse",
          "correct": false,
          "feedback": "Erreur : l'ordre décroissant demande l'option `-r`.\n"
        }
      ],
      "explanation": "`sort` est un filtre : il lit, trie, affiche. Pour conserver le\nrésultat, on redirige vers un fichier."
    },
    {
      "id": "q34",
      "difficulty": 3,
      "skills": [
        "redirection",
        "ecraser",
        "danger"
      ],
      "title": "Un fichier vidé par mégarde",
      "partie": "redirections",
      "statement": "Théo tape `sort notes.txt > notes.txt` pour trier son fichier sur\nplace. Que se passe-t-il ?",
      "options": [
        {
          "text": "Le fichier est vidé avant d'être lu, et il ne reste rien",
          "correct": true,
          "feedback": "Bonne réponse : la redirection `>` ouvre et vide `notes.txt`\navant que `sort` ne commence à le lire. Il faut écrire dans un\nautre fichier, puis renommer.\n"
        },
        {
          "text": "Le fichier est trié sur place, comme voulu",
          "correct": false,
          "feedback": "Erreur : la redirection agit avant la commande, qui lit un\nfichier déjà vide.\n"
        },
        {
          "text": "Le terminal refuse, un fichier ne pouvant être lu et écrit à la fois",
          "correct": false,
          "feedback": "Erreur : aucun refus ; c'est précisément le problème, l'ordre\ndes opérations n'est pas vérifié.\n"
        },
        {
          "text": "Le fichier est dupliqué",
          "correct": false,
          "feedback": "Erreur : rien n'est copié ; le contenu est perdu.\n"
        }
      ],
      "explanation": "Une redirection vers le fichier d'entrée est un piège classique :\n`sort notes.txt > tri.txt` puis `mv tri.txt notes.txt`."
    },
    {
      "id": "q35",
      "difficulty": 3,
      "skills": [
        "redirection",
        "entree"
      ],
      "title": "Fournir un fichier en entrée",
      "partie": "redirections",
      "statement": "Un programme `python3 moyenne.py` lit des nombres au clavier avec\n`input`. Que fait `python3 moyenne.py < nombres.txt` ?",
      "options": [
        {
          "text": "Le programme lit ses saisies dans le fichier, pas au clavier",
          "correct": true,
          "feedback": "Bonne réponse : `<` redirige l'entrée standard. Chaque `input`\nreçoit la ligne suivante du fichier, comme si elle avait été\ntapée.\n"
        },
        {
          "text": "Le programme écrit ses résultats dans `nombres.txt`",
          "correct": false,
          "feedback": "Erreur : écrire dans un fichier se fait avec `>`.\n"
        },
        {
          "text": "Le programme est comparé au fichier, ligne par ligne",
          "correct": false,
          "feedback": "Erreur : `<` n'est pas un opérateur de comparaison dans le\nshell.\n"
        },
        {
          "text": "Le fichier est exécuté comme un programme Python",
          "correct": false,
          "feedback": "Erreur : le programme reste `moyenne.py` ; le fichier ne fait\nque fournir les données.\n"
        }
      ],
      "explanation": "Trois redirections : `<` pour l'entrée, `>` et `>>` pour la sortie.\nElles permettent de tester un programme sans rien taper."
    },
    {
      "id": "q36",
      "difficulty": 1,
      "skills": [
        "cd",
        "dossier-personnel"
      ],
      "title": "cd sans argument",
      "partie": "arborescence",
      "statement": "Que fait la commande `cd` tapée sans aucun argument ?",
      "options": [
        {
          "text": "Elle ramène dans le dossier personnel de l'utilisateur",
          "correct": true,
          "feedback": "Bonne réponse : sans destination, `cd` retourne au dossier\npersonnel, le même que `cd ~`.\n"
        },
        {
          "text": "Elle remonte d'un niveau dans l'arborescence",
          "correct": false,
          "feedback": "Erreur : remonter d'un niveau s'écrit `cd ..`.\n"
        },
        {
          "text": "Elle affiche le chemin du dossier courant",
          "correct": false,
          "feedback": "Erreur : afficher le dossier courant est le rôle de `pwd`.\n"
        },
        {
          "text": "Elle provoque une erreur, un argument étant obligatoire",
          "correct": false,
          "feedback": "Erreur : l'argument est facultatif.\n"
        }
      ],
      "explanation": "`cd` seul, `cd ~` et `cd /home/nom` conduisent au même endroit : le\ndossier personnel."
    },
    {
      "id": "q37",
      "difficulty": 2,
      "skills": [
        "ls",
        "chemin",
        "argument"
      ],
      "title": "Lister un dossier sans s'y déplacer",
      "partie": "arborescence",
      "statement": "Lina est dans son dossier personnel et veut voir le contenu de\n`/home/lina/cours/images` sans changer de dossier courant. Que\ntape-t-elle ?",
      "options": [
        {
          "text": "`ls cours/images`",
          "correct": true,
          "feedback": "Bonne réponse : `ls` accepte un chemin en argument, relatif au\ndossier courant ou absolu. Le dossier courant reste inchangé.\n"
        },
        {
          "text": "`cd cours/images` puis `ls`, sans autre possibilité",
          "correct": false,
          "feedback": "Erreur : cela fonctionne, mais change le dossier courant, ce que\nLina ne voulait pas.\n"
        },
        {
          "text": "`ls` seul, qui liste toute l'arborescence",
          "correct": false,
          "feedback": "Erreur : `ls` seul ne liste que le dossier courant.\n"
        },
        {
          "text": "`open cours/images`",
          "correct": false,
          "feedback": "Erreur : `open` n'est pas une commande de listage sous Linux.\n"
        }
      ],
      "explanation": "La plupart des commandes acceptent un chemin : `ls`, `cat` ou `cp`\ntravaillent sur n'importe quel dossier sans qu'on s'y déplace."
    },
    {
      "id": "q38",
      "difficulty": 2,
      "skills": [
        "racine",
        "ls",
        "arborescence"
      ],
      "title": "Le sommet de l'arborescence",
      "partie": "arborescence",
      "statement": "Que désigne `/` seul, par exemple dans `ls /` ?",
      "options": [
        {
          "text": "La racine, dossier qui contient tous les autres",
          "correct": true,
          "feedback": "Bonne réponse : `ls /` liste les dossiers de premier niveau du\nsystème, comme `home`, `etc` ou `usr`.\n"
        },
        {
          "text": "Le dossier personnel de l'utilisateur",
          "correct": false,
          "feedback": "Erreur : le dossier personnel s'écrit `~`.\n"
        },
        {
          "text": "Le dossier courant, quel qu'il soit",
          "correct": false,
          "feedback": "Erreur : le dossier courant s'écrit `.`.\n"
        },
        {
          "text": "Un séparateur sans signification lorsqu'il est seul",
          "correct": false,
          "feedback": "Erreur : `/` sépare les niveaux d'un chemin, mais seul il désigne\nla racine.\n"
        }
      ],
      "explanation": "Tout chemin absolu commence par `/`, la racine : `/home/lina/cours`\ndescend de niveau en niveau depuis le sommet."
    },
    {
      "id": "q39",
      "difficulty": 3,
      "skills": [
        "chemin-relatif",
        "navigation"
      ],
      "title": "Atteindre un dossier voisin",
      "partie": "arborescence",
      "statement": "Lina est dans `/home/lina/cours/nsi`. Le fichier `logo.png` se\ntrouve dans `/home/lina/cours/images`. Quel chemin relatif le\ndésigne ?",
      "options": [
        {
          "text": "`../images/logo.png`",
          "correct": true,
          "feedback": "Bonne réponse : `..` remonte dans `cours`, puis on descend dans\n`images`.\n"
        },
        {
          "text": "`images/logo.png`",
          "correct": false,
          "feedback": "Erreur : ce chemin chercherait `images` à l'intérieur de `nsi`.\n"
        },
        {
          "text": "`/images/logo.png`",
          "correct": false,
          "feedback": "Erreur : un chemin commençant par `/` part de la racine, où il\nn'y a pas de dossier `images`.\n"
        },
        {
          "text": "`../../images/logo.png`",
          "correct": false,
          "feedback": "Erreur : deux remontées mènent dans `/home/lina`, qui ne contient\npas `images` directement.\n"
        }
      ],
      "explanation": "Un chemin relatif se construit depuis le dossier courant : chaque\n`..` remonte d'un niveau, puis on redescend."
    },
    {
      "id": "q40",
      "difficulty": 2,
      "skills": [
        "cp",
        "dossier",
        "recursif"
      ],
      "title": "Copier un dossier entier",
      "partie": "fichiers",
      "statement": "`cp projet sauvegarde` échoue avec un message indiquant que\n`projet` est un dossier. Comment le copier avec son contenu ?",
      "options": [
        {
          "text": "`cp -r projet sauvegarde`",
          "correct": true,
          "feedback": "Bonne réponse : l'option `-r`, pour récursif, demande à `cp` de\ndescendre dans le dossier et de copier tout ce qu'il contient.\n"
        },
        {
          "text": "`cp projet/* sauvegarde`",
          "correct": false,
          "feedback": "Erreur : cela copierait les fichiers du premier niveau, mais pas\nles sous-dossiers.\n"
        },
        {
          "text": "`mv projet sauvegarde`",
          "correct": false,
          "feedback": "Erreur : `mv` déplace, l'original disparaîtrait.\n"
        },
        {
          "text": "`copy projet sauvegarde`",
          "correct": false,
          "feedback": "Erreur : `copy` n'est pas une commande Unix.\n"
        }
      ],
      "explanation": "Copier ou supprimer un dossier demande l'option récursive, qui\nparcourt toute la sous-arborescence."
    },
    {
      "id": "q41",
      "difficulty": 3,
      "skills": [
        "mv",
        "ecrasement",
        "danger"
      ],
      "title": "Un renommage qui écrase",
      "partie": "fichiers",
      "statement": "Le dossier contient `brouillon.txt` et `final.txt`. Théo tape\n`mv brouillon.txt final.txt`. Que se passe-t-il ?",
      "options": [
        {
          "text": "`final.txt` est écrasé par `brouillon.txt`, sans avertissement",
          "correct": true,
          "feedback": "Bonne réponse : `mv` écrase la destination si elle existe. Le\ncontenu de l'ancien `final.txt` est perdu.\n"
        },
        {
          "text": "Le terminal refuse, `final.txt` existant déjà dans le dossier",
          "correct": false,
          "feedback": "Erreur : par défaut, aucune protection ; l'option `-i` demande\nune confirmation.\n"
        },
        {
          "text": "Les deux fichiers sont fusionnés en un seul",
          "correct": false,
          "feedback": "Erreur : `mv` ne concatène rien ; réunir deux fichiers se fait\navec `cat`.\n"
        },
        {
          "text": "`brouillon.txt` est copié dans `final.txt` et conservé",
          "correct": false,
          "feedback": "Erreur : `mv` déplace ; l'original n'existe plus.\n"
        }
      ],
      "explanation": "Les commandes du shell font ce qu'on leur demande sans discuter :\nvérifier la destination avant `mv` ou `cp` évite les pertes."
    }
  ]
}