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

262 lines
7.1 KiB
XML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!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. Dernière modification le 2002-12-08.
</div>
</body>
</html>