Space Menu Home Downloads Goodies Newbie Area Documentation Knowledge Base E-Training Forum Blogs RPM Farm Linux Events
HistoryHistory |



Copie-5 : Copie de répertoires (suite) - Copie et écrasement (suite et fin)

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 !!

Pour mettre à jour une copie existante, en se bornant à y introduire les fichiers et répertoires de la source qui sont absents de la copie (en général, ceux qui ont donc été créés dans la source depuis la dernière copie).
Laisse, par conséquent, intacts les fichiers déjà copiés même s'ils ont été modifiés dans l'original. Permet donc de conserver des versions anciennes de fichiers déjà copiés.

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

Description de l'option

Dans le cas standard où vous ne modifiez jamais la copie directement, cette option s'emploie pour mettre à jour une copie déjà existante, en se bornant à y copier les "éléments nouveaux" : 1) y remplacer les fichiers qui ont été modifiés dans l'original (la source) depuis la dernière copie 2) copier les répertoires ou fichiers nouveaux, créés dans l'original depuis la dernière copie.

Permet donc alors de ne pas remplacer inutilement ce qui n'a pas été modifié. Economise, de ce fait, du temps et aussi de l'usure des organes mécaniques de l'ordinateur qui jouent un rôle lors de la copie, par rapport à une copie "brutale" qui copierait tout et écraserait un fichier destination même quand il est strictement identique à un fichier de la source.

Le cas échéant, si vous avez modifié la copie directement, permet aussi de conserver sur la copie une version d'un fichier qui serait plus récente dans la copie que la version présente sur le répertoire source. Cette propriété permet d'utiliser l'option pour synchroniser des répertoires, comme nous le verrons plus bas.

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 conserverez donc toujours la version la plus récente du fichier, qu'elle se trouve initialement dans la source ou dans la destination; elle vous protège contre l'effacement intempestif d'une version récente qui se trouverait (par accident ?) sur la copie.

Emploi de -u pour une mise à jour

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é ou créé, sur votre disque dur local, quelques fichiers dans le 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). Toutefois, comme on le verra plus bas, l'option ne fonctionne pas si la partition destination a été formatée en 'vfat'.

Emploi de -u pour une synchronisation

Si vous avez modifié directement des fichiers ET sur la source ET sur la destination, vous pouvez les synchroniser, autrement dit faire en sorte que l'un et l'autre contiennent la version la plus récente, en utilisant la commande complexe suivante :

cp -ua projets_encours/* /mnt/CLE_USB/projets_encours/ && cp -ua /mnt/CLE_USB/projets_encours/*  projets_encours/

Limitation : le cas d'une partition "vfat"

Malheureusement, en raison d'une gestion différente des propriétés, si le disque ou la partition destination est de type 'vfat', l'option -u est inopérante.

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 : Créer un nouvel exemplaire d'un fichier - Autocopie ?
Auteur : ptyxs (février 2006) - Dernière révision : septembre 2006.
Legal: This page is covered by the GNU Free Documentation License . Standard disclaimers of warranty apply. Copyright LSTB and Mandrakesoft.

RSS
KB.CPSummary > Copie-5 : Copie de répertoires (suite) - Copie et écrasement (suite et fin) (fr)
Creator: ptyxs  Date: 2006/02/23 17:21
Last Author: ptyxs  Date: 2006/10/14 10:38
Copyright (c) 2006 Mandriva