# cp et mv

# Corrigé des exercices sur `cp` et `mv`

Ces exercices sont des questions de cours : les solutions se trouvent toutes dans les pages de man des commandes en question. On suppose donc connues les commandes de `less`, qui servent à se déplacer dans les pages de man... et la commande servant à chercher un mot. Testez les commandes sur des fichiers et répertoires d'essai pour vous faire la main et comprendre ce qui se passe.

## `cp`

1. Est-il possible de faire une copie d'un répertoire et de l'ensemble de ses sous-répertoires en une seule ligne de commande ?

   Oui, c'est à cela que sert l'option `-r` (recursive). Supposons, suivant l'arborescence d'exemple, que vous voulez copier le répertoire `Rapport` et ses sous-répertoires dans le répertoire `www`. Il faut taper :

       cp -r Rapport/ www/

   ou

       cp -R Rapport/ www/

2. Que se passe-t-il si l'on veut faire une copie appelée `tentative/` de son répertoire `essai/`, et que le répertoire `tentative/` existe déjà ?

   Quand on indique le nom d'un répertoire qui n'existe pas, `cp` considère qu'il s'agit du nom à donner à la copie du premier répertoire (ou fichier). Quand le répertoire existe déjà, `cp` considère qu'il s'agit de l'endroit où il faut placer la copie du premier élément (la «cible» : target).

   Si donc on tape

       cp -R essai/ tentative/

   et que `tentative/` existe déjà, on obtient une copie de `essai/`, également appelée `essai/`, placée dans le répertoire `tentative/`.

3. Que se passe-t-il si vous voulez faire une copie d'un fichier dans un répertoire où il existe déjà un fichier de ce nom ?

   Le programme demande si vous voulez vraiment effacer le fichier déjà existant pour le remplacer par celui dont vous faites la copie.

   # &icone.attention; Attention &icone.attention;

   Il en est ainsi parce que vous avez un alias de `cp` sur `cp -i`, qui demande confirmation. Ce n'est pas nécessairement le cas partout.

   &icone.note;Pour savoir quels sont vos alias, tapez «`alias`» ou allez voir dans votre fichier `.alias`. Avec la config conscrits, les alias sont dans le `.zshrc` (le fichier de configuration du shell `zsh`).

4. Quel est l'effet d'une ligne comme :

       cp fichier1 fichier2 fichier3 repertoire/

   Les fichiers `fichier1`, `fichier2` et `fichier3` sont copiés sous leur nom dans le répertoire `répertoire/`, qui doit exister.

## `mv`

1. Que se passe-t-il si le fichier «cible» existe déjà ?

   Si vous avez un alias de `mv` sur `mv -i` (cas de la config conscrits), le programme demande si vous voulez réécrire le fichier cible en remplaçant son contenu par celui du fichier de départ :

       bireme ~ $ ls
       rapport.tex     notes     complements
       bireme ~ $mv notes complements
       mv: overwrite complements (yes/no)? y
       bireme ~ $ls
       rapport.tex     complements

2. Supposez que vous avez chez vous l'arborescence que voici, et que vous vous trouvez dans `~/Rapport/docs/`.
   - Comment faites-vous pour y amener `Rapport.tex` qui se trouve dans le répertoire père ?

         mv ../Rapport.tex .

     Amener le fichier `Rapport.tex` situé dans répertoire père (`../Rapport.tex`) dans le répertoire où on se trouve (`.` : ici).

   - Comment faites-vous ensuite pour ramener ce fichier à son emplacement d'origine ?

         mv Rapport.tex ..

     Amener le fichier `Rapport.tex` situé dans le répertoire courant, dans le répertoire père (`..`).

3. Comment renommer un répertoire `bla/` en `blo/` ? Que se passe-t-il si le répertoire `blo` existe déjà ?

   Il suffit de taper

       mv bla/ blo/

   Si jamais `blo/` existe déjà, `bla/` devient un sous-répertoire de `blo/`.

4. Comment faire pour à la fois déplacer un fichier et changer son nom ? Que se passe-t-il si il existe déjà un fichier de ce nom dans le répertoire d'arrivée ?

   Supposons que l'on veut amener `Rapport.tex` dans le répertoire courant, et l'appeler `stage`. On tape :

       mv ../Rapport.tex stage

   `Rapport.tex` est à la fois déplacé et renommé; vous pouvez vérifier qu'il n'est plus dans `Rapport` et qu'il y a désormais un fichier `stage` dans `docs/`.

   Si le fichier d'arrivée existe déjà, on se retrouve dans le cas vu tout au début de cet exercice (remplacement ou non).

5. Mêmes questions avec un répertoire .

   Pour déplacer et renommer, la syntaxe est la même que pour un fichier :

       mv ../bla ble/

   déplace le répertoire `bla/` du répertoire père dans le répertoire courant, et le renomme en `ble/`. Si jamais `ble/` existe déjà, `bla/` y est déplacé sous son nom, et devient un sous-répertoire de `ble/`.

6. Que se passe-t-il si on lance `mv` avec les options `-i` et `-f` ensemble ? .

   L'option `-f` (force) sert à renommer le fichier impérativement, même si le fichier cible existe déjà, sans demander confirmation. L'option `-i` (interactive) demande confirmation. Des deux options, c'est `-f` qui l'emporte :

       bireme ~ $ ls
       bla	tutu	Rapport/
       bireme ~ $ alias mv
       mv='mv -i'
       bireme ~ $ mv bla tutu
       mv: overwrite tutu (yes/no)? n
       bireme ~ $ mv -f bla tutu
       bireme ~ $ ls
       tutu    Rapport/

Auteur : Émilia Robin, Joël Riou.