tuteurs.ens.fr/unix/exercices/solutions/cp_mv-sol.tml

263 lines
7.2 KiB
Text
Raw Normal View History

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
"tuteurs://DTD/tml.dtd">
<html>
<head>
<title>cp et mv</title>
</head>
<body>
<h1>Corrigé des exercices sur <code>cp</code> et <code>mv</code></h1>
<p>
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 <code>less</code>, 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.
</p>
<h2><a name="cp"><code>cp</code></a></h2>
<ol>
<li><a name="cp1"> <strong>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 ?</strong> </a>
<p>
Oui, c'est à cela que sert l'option <code>-r</code> (<em>recursive</em>).
Supposons, suivant l'<a href="../mkdir_cd.html#arbo">arborescence d'exemple</a>,
que vous voulez copier le répertoire <code>Rapport</code> et ses
sous-répertoires dans le répertoire <code>www</code>. Il faut
taper :</p>
<pre>
cp -r Rapport/ www/
</pre>
<p class="continue">
ou
</p>
<pre>
cp -R Rapport/ www/
</pre></li>
<li><a name="cp2"> <strong>Que se passe-t-il si l'on veut faire une copie
appelée <code>tentative/</code> de son répertoire <code>essai/</code>, et que
le répertoire <code>tentative/</code> existe déjà ?</strong> </a>
<p>Quand on indique le nom d'un répertoire qui n'existe pas, <code>cp</code>
considère qu'il s'agit du nom à donner à la copie du premier répertoire (ou
fichier). Quand le répertoire existe déjà, <code>cp</code> considère qu'il
s'agit de l'endroit où il faut placer la copie du premier élément (la
«cible» : <em>target</em>).</p>
<p>
Si donc on tape
</p>
<pre>
cp -R essai/ tentative/
</pre>
<p class="continue">
et que <code>tentative/</code> existe déjà, on obtient une copie de
<code>essai/</code>, également appelée <code>essai/</code>, placée dans le
répertoire <code>tentative/</code>.
</p>
</li>
<li><a name="cp3"> <strong>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 ?</strong> </a>
<p>
Le programme demande si vous voulez vraiment effacer le fichier déjà existant
pour le remplacer par celui dont vous faites la copie.
</p>
<div class="attention">
<h1>&icone.attention; Attention &icone.attention;</h1>
<p> Il en est
ainsi parce que vous avez un alias de <code>cp</code> sur <code>cp -i</code>,
qui demande confirmation. Ce n'est pas nécessairement le cas partout.
</p>
<p>&icone.note;Pour savoir quels sont vos
alias, tapez «<code>alias</code>» ou allez voir dans votre fichier
<code>.alias</code>. Avec la config conscrits, les alias sont dans le
<code>.zshrc</code> (le fichier de configuration du shell
<code>zsh</code>).</p>
</div></li>
<li><a name="cp4"> <strong>Quel est l'effet d'une ligne comme :
</strong></a>
<pre>
cp fichier1 fichier2 fichier3 repertoire/
</pre>
<p>
Les fichiers <code>fichier1</code>, <code>fichier2</code> et
<code>fichier3</code> sont copiés sous leur nom dans le répertoire
<code>répertoire/</code>, qui doit exister.
</p>
</li>
</ol>
<h2><a name="mv"><code>mv</code></a></h2>
<ol>
<li><a name="mv1"> <strong>Que se passe-t-il si le fichier «cible» existe
déjà ?</strong> </a>
<p>
Si vous avez un alias de <code>mv</code> sur <code>mv -i</code> (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 :
</p>
<pre>
<span class="prompt">bireme ~ $</span> ls
rapport.tex notes complements
<span class="prompt">bireme ~ $</span>mv notes complements
mv: overwrite complements (yes/no)? y
<span class="prompt">bireme ~ $</span>ls
rapport.tex complements
</pre>
</li>
<li><a name="mv2"> Supposez que vous avez chez vous l'arborescence</a> <a
href="../mkdir_cd.html#arbo">que voici</a>, et que vous vous trouvez dans
<code>~/Rapport/docs/</code>.
<ul>
<li> <strong>Comment faites-vous pour y amener <code>Rapport.tex</code> qui
se trouve dans le répertoire père ?</strong>
<pre>
mv ../Rapport.tex .
</pre>
<p>Amener le fichier <code>Rapport.tex</code> situé dans répertoire père
(<code>../Rapport.tex</code>) dans le répertoire où on se trouve
(<code>.</code> : ici).
</p></li>
<li> <strong>Comment faites-vous ensuite pour ramener ce fichier à son
emplacement d'origine ?</strong>
<pre>
mv Rapport.tex ..
</pre>
<p>Amener le fichier <code>Rapport.tex</code> situé dans le répertoire courant,
dans le répertoire père (<code>..</code>).</p></li>
</ul>
</li>
<li><a name="mv3"> <strong>Comment renommer un répertoire
<code>bla/</code> en <code>blo/</code> ? Que se passe-t-il si le
répertoire <code>blo</code> existe déjà ?</strong> </a>
<p>Il suffit de taper
</p>
<pre>
mv bla/ blo/
</pre>
<p>
Si jamais <code>blo/</code> existe déjà, <code>bla/</code> devient un
sous-répertoire de <code>blo/</code>.
</p>
</li>
<li><a name="mv4"> <strong>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 ? </strong></a>
<p>
Supposons que l'on veut amener <code>Rapport.tex</code> dans le répertoire
courant, et l'appeler <code>stage</code>. On tape :
</p>
<pre>
mv ../Rapport.tex stage
</pre>
<p>
<code>Rapport.tex</code> est à la fois déplacé et renommé; vous pouvez
vérifier qu'il n'est plus dans <code>Rapport</code> et qu'il y a désormais un
fichier <code>stage</code> dans <code>docs/</code>.
</p>
<p>
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).
</p>
</li>
<li><a name="mv5"> <strong>Mêmes questions avec un répertoire</strong> </a>.
<p>Pour déplacer et renommer, la syntaxe est la même que pour un fichier :
</p>
<pre>
mv ../bla ble/
</pre>
<p class="continue">
déplace le répertoire <code>bla/</code> du répertoire père dans le répertoire
courant, et le renomme en <code>ble/</code>. Si jamais <code>ble/</code>
existe déjà, <code>bla/</code> y est déplacé sous son nom, et devient un
sous-répertoire de <code>ble/</code>.
</p>
</li>
<li><a name="mv6"> <strong> Que se passe-t-il si on lance <code>mv</code>
avec les options <code>-i</code> et <code>-f</code> ensemble ? </strong>
</a>.
<p>
L'option <code>-f</code> (<em>force</em>) sert à renommer le fichier
impérativement, même si le fichier cible existe déjà, sans demander
confirmation. L'option <code>-i</code> (<em>interactive</em>) demande
confirmation. Des deux options, c'est <code>-f</code> qui l'emporte :
</p>
<pre>
<span class="prompt">bireme ~ $</span> ls
bla tutu Rapport/
<span class="prompt">bireme ~ $</span> alias mv
mv='mv -i'
<span class="prompt">bireme ~ $</span> mv bla tutu
mv: overwrite tutu (yes/no)? n
<span class="prompt">bireme ~ $</span> mv -f bla tutu
<span class="prompt">bireme ~ $</span> ls
tutu Rapport/
</pre>
</li>
</ol>
<div class="metainformation">
Auteur : Émilia Robin, Joël Riou. <date value="from git" />
</div>
</body>
</html>