Space Menu Home Downloads Kiosk Newbie Area Documentation Knowledge Base E-Training Forum Blogs Chat RPMs Farm Linux Events
HistoryHistory |
View
Code | XML |
Help
XWiki Syntax |



Page précédente : CP-4

CP-5 :

Sommaire : Toutes les pages sur la copie - Index de la section - Index de la Base de Connaissances

Reproduire le contenu d'un répertoire existant dans un autre répertoire existant

Nous avons vu à la page précédente :

  • comment créer, avec cp, un répertoire nouveau et, en même temps, y copier le contenu d'un répertoire existant
  • comment copier un répertoire et son contenu dans un répertoire existant...
Il nous reste à examiner le cas de figure où l'on souhaite copier le contenu d'un répertoire existant dans un autre répertoire également existant… sans recopier le répertoire d'origine lui-même… vous voyez la chose ?

Pour cela, on utilise l'expansion des noms de fichiers. Plus spécifiquement, nous allons faire usage ici du 'méta-caractère' (ou 'joker') '*' (aussi appelé 'l'étoile').

Par exemple, pour copier le contenu du répertoire panades/ (mais non le répertoire panades/ lui-même) dans un répertoire soupes/ qui existe déjà, on pourra faire ceci :

cp -a panades/*  soupes/
ainsi la (précieuse) recette panades/auvergnate.txt se verra reproduite comme soupes/auvergnate.txt (et non comme soupes/panades/auvergnate.txt !).

Qu'on se le dise une bonne fois : pas d'écrasement !!

Bien sûr, dans un répertoire existant, comme notre soupes/ de la section précédente, il peut y avoir des tas de choses qu'on peut avoir envie de préserver de tout écrasement intempestif. Rien là de bien nouveau pour le lecteur soigneux de ces pages que vous êtes : l'option '-i' et l'alias de Mandriva, dont nous avons parlé en CP-3, qui remplace 'cp' par 'cp -i' règlent la question, me direz-vous. Certes. Mais imaginez qu'il y ait un très grand nombre de fichiers 'écrasables' dans soupes/… Vous voyez le problème ? Répondre 'n' cinq fois à 'cp', bon, mais 93 fois ?? Terrifiant… Pour trouver un peu d'apaisement, poursuivez donc votre lecture, cette section - ou la suivante - vous permettront peut-être d'éviter une telle situation...

Il existe une option de 'cp' qui vous permet de lui dire une bonne fois que vous répondez 'n', (autrement dit : 'non'), à toutes les questions… c'est l'option '--reply'. Vous pourrez parvenir à ce résultat en donnant à '--reply' la valeur 'no', comme dans la ligne de commande ci-dessous - il est évidemment nécessaire que les bonnes questions soient posées et donc d'activer aussi l'option '-i' :

cp -ai --reply=no panades/* soupes/
L'option '-i' oblige 'cp' à demander une confirmation pour tout écrasement, mais l'option '--reply=no' fournit automatiquement la réponse, sans que vous ayez à intervenir. Cette commande vous garantira donc qu'aucun des fichiers déjà présents dans soupes/ ne sera remplacé par la version correspondante du répertoire panades/

Vous trouverez un exemple d'emploi de ce type de commande dans l'encadré final de la page de la Base de Connaissances de Mandriva sur la conversion de man en Latin1.

Toutes les pages sur la copie - Index de la section - Index de la Base de Connaissances

N'écraser que les plus vieux avec -u

L'option -u (de l'anglais update = mettre à jour) permet de réserver l'écrasement à des cas où un fichier du répertoire source possède, non seulement un nom identique à celui d'un fichier du répertoire de destination, mais aussi une date postérieure à celle du fichier du répertoire de destination.

En utilisant cette option, vous ne conserverez donc que la version la plus récente du fichier.

Par exemple, si vous avez copié un répertoire et tout son contenu sur un disque dur externe ou sur une clé USB et si, depuis lors, sans avoir touché au support externe, vous avez modifié sur votre disque dur local quelques fichiers du répertoire en question, vous pourrez effectuer une mise à jour du disque externe par une commande analogue à celle-ci :

cp -ua projets_encours/* /mnt/CLE_USB/projets_encours/
(dans cet exemple, le répertoire copié sur disque externe est projets_encours, je suppose que vous êtes dans un répertoire de travail qui appartient à votre disque dur local et que votre disque externe a pour point de montage /mnt/CLE_USB).

Ecraser un répertoire ? Mais c'est inécrasable, ça !

Pour bien comprendre ce que vous faites lorsque vous procédez à une copie 'récursive" (autrement dit une copie susceptible de copier des répertoires), il peut être utile de comparer avec soin certains aspects du fonctionnement des deux lignes de commande suivantes :

cp -a prune.txt confitures/
cp -a agrumes/ confitures/
La première ligne vise à copier un fichier à la racine du répertoire de destination (confitures/). S'il se trouve que confitures/ contient, à sa racine, un fichier homonyme (confitures/prune.txt), ce dernier court le risque d'être écrasé (sur l'écrasement et les moyens de s'en prémunir voir CP-3 et les sections précédentes de la présente page).

La seconde ligne vise, elle, à copier un répertoire à la racine du répertoire de destination (confitures/). Mais, cette fois, s'il se trouve que confitures/ contient à sa racine, un répertoire homonyme (confitures/agrumes/), alors, ce répertoire ne court en aucun cas le risque d'être écrasé. Il ne sera pas purement et simplement remplacé par une copie. Il se passera plutôt ceci : le contenu du répertoire agrumes/ sera copié dans le répertoire déjà existant confitures/agrumes/. Quelle différence cela fait-il ? Eh bien, si le répertoire confitures/agrumes/ avait un contenu propre avant l'opération, il le conservera.

Illustrons.

Supposons qu'avant la copie, agrumes/ contenait les fichiers :

  • orange.txt
  • citron.txt
tandis que confitures/agrumes/ contenait :
  • citron.txt
  • citron_vert.txt.
Après la copie, confitures/agrumes/ contiendra :
  • orange.txt
  • citron.txt
  • citron_vert.txt.
Le point crucial est que citron_vert.txt, qui ne se trouvait pas dans le répertoire source, est conservé. Quant à citron.txt, il aura ou non été écrasé selon la façon dont vous aurez géré l'écrasement de fichiers (voir CP-3 et les sections précédentes de la présente page).

Tout cela est général, et vaudrait aussi en cas de copie de sous-répertoires plus profondément enfouis dans l'arborescence. Un répertoire ou un sous-répertoire, à la différence d'un fichier, n'est jamais écrasé par la copie.

Notez qu'il en va de même si vous effectuer une copie "à la main", dans une interface graphique comme Konqueror.

Et si je voulais, moi, que le répertoire de destination soit écrasé ?! Dans notre exemple, vous n'auriez alors qu'à effacer le répertoire en question avant copie :

rm -rf /confitures/agrumes/ ; cp -a agrumes/ confitures/
Pour la première commande de cette ligne voir rm, et pour le sens du symbole ';' voir l'enchaînement de commandes.

Après exécution de cette ligne de commande, le contenu de confitures/agrumes/ serait bien sûr :

  • orange.txt
  • citron.txt
Le fichier citron_vert.txt aurait disparu.
Page suivante : CP-6
Auteur : ptyxs (février 2006)
Legal: This page is covered by the GNU Free Documentation License . Standard disclaimers of warranty apply. Copyright LSTB and Mandrakesoft.

RSS
KB.CP-5 fr Last Author: ptyxs  Date: 2006/04/15 13:06
Powered by XWiki
Copyright (c) 2006 Mandriva