Copie de fichiers ou de répertoires

Un article de Wiki de la communauté Mandriva.

Jump to: navigation, search

Les pages qui suivent visent à vous permettre de bien maîtriser une opération très courante : la copie d'un ou plusieurs fichiers ou répertoires d'un point à un autre du système (ou du réseau).

Je ne prétends pas cependant à l'exhaustivité et ne couvrirai fort probablement pas tous les aspects de la question. J'essaierai d'aborder diverses fonctionnalités de la copie sous Linux qui me semblent utiles à connaître et qui sont peu, pas ou trop sommairement mentionnées dans la plupart des documentations accessibles.

Dans ce qui suit, je supposerai que vous avez au moins une idée de l'organisation du système de fichiers de Linux et que vous savez désigner un fichier ou un répertoire par son chemin, absolu ou relatif. Je supposerai aussi que vous savez ce qu'on entend par répertoire de travail (aussi appelé répertoire courant).

Pour copier fichiers ou répertoires, il est possible d'utiliser deux sortes de techniques distinctes : la copie à la main dans une interface graphique ou la copie en ligne de commandes. Nous allons présenter l'une et l'autre et les comparer.

Sommaire

[modifier] Copier avec l'interface graphique

Je prendrai l'exemple du navigateur de fichiers Konqueror sous KDE. Des procédures analogues existent sous d'autres interfaces graphiques et avec d'autres navigateurs de fichiers (par exemple Nautilus sous GNOME).

[modifier] Ouverture et préparation du navigateur de fichiers

  1. Ouvrez Konqueror.
  2. Pressez la touche F9.
  3. Eventuellement, cliquez - dans la barre verticale située tout à fait à gauche dans la fenêtre de Konqueror - sur l'icône Dossier personnel Image:Folder home.png ou sur l'icône Système de fichiers Image:Folder red.png.
  4. La fenêtre de Konqueror contient alors deux grandes parties. Sélectionnez d'un clic un répertoire dans la partie gauche : vous verrez son contenu s'afficher dans la partie droite.

Pour naviguer à travers le système de fichiers et atteindre le répertoire qui vous intéresse, notez ceci :

  • Dans la partie gauche de la fenêtre de Konqueror, tout répertoire qui contient lui-même un ou plusieurs répertoire(s) est précédé, d'une mini-icône en forme de signe plus (+). Un simple clic sur ce + fera apparaitre les sous-répertoires.
  • Inversement, pour remonter vers le répertoire parent de celui dans lequel vous vous trouvez, cliquez sur la flèche vers le haut qui se trouve tout en haut, dans la barre d'outils de Konqueror.

[modifier] Copie à la main

  1. Sélectionner les fichiers ou répertoires à copier
    Pour copier un fichier ou un répertoire vous devez le sélectionner dans la partie droite de la fenêtre :
    • pour sélectionner un seul fichier ou répertoire, cliquer sur lui
    • pour sélectionner un ensemble de fichiers/répertoires :
      • a. s'ils sont contigus à l'affichage, appuyer sur la touche MAJ (majuscule) et cliquer sur le premier fichier puis ensuite sur le dernier, ces deux fichiers/répertoires et tous ceux qui sont situés entre eux seront sélectionnés
      • b. s'ils sont non contigus à l'affichage, appuyer sur la touche Ctrl et cliquer successivement sur chacun des fichiers/répertoires à sélectionner.
  2. Copier...
    1. ...par déplacement du curseur de la souris
      1. Placer le curseur de la souris sur la sélection, appuyer sur le bouton gauche et tout en le maintenant pressé, déplacez le curseur de la souris jusqu'à la partie gauche de la fenêtre.
      2. Lorsque vous êtes au-dessus du répertoire destination, celui-ci est visuellement sélectionné.
      3. Lâchez alors le bouton de la souris.
      4. Dans le menu qui s'affiche, cliquez sur Copier ici.
    2. ...par copier/coller
      La manœuvre qui précède peut devenir délicate et source d'erreurs si le répertoire de destination est « loin » des fichiers à copier au point qu'il soit impossible de les faire figurer les uns et les autres sur une même fenêtre du navigateur de fichiers.
      Dans ce cas vous pouvez faire un copier/coller.
      • Dans la partie droite de la fenêtre de Konqueror, faites un clic droit sur la sélection et choisissez Copier dans le menu qui s'affiche. Naviguez ensuite dans la partie gauche de la fenêtre de Konqueror, jusqu'au répertoire de destination que vous sélectionnez d'un clic droit et choisissez Coller dans le menu qui s'affiche.
    3. ...en naviguant dans le menu contextuel
    Dans la partie droite de la fenêtre de Konqueror, faites un clic droit sur la sélection à copier et choisissez Copier vers..., puis, à travers les choix qui vous sont proposés, naviguez jusqu'au répertoire destination, parvenu en ce point, faites un clic gauche sur Copier ici.

Si vous avez l'impression d'avoir commis une erreur au cours de la manœuvre, alors en général le navigateur de fichiers vous offre une option d'annulation de la dernière opération effectuée. Sous Konqueror par exemple, vous pouvez y accéder par le menu Edition puis Annuler.

[modifier] Et si copier un fichier risque d'effacer un fichier de même nom déjà présent...

Si un fichier portant le nom d'un fichier qu'on souhaite copier est déjà présent dans le répertoire de destination, Konqueror ouvre une fenêtre et vous invite à choisir entre trois possibilités :

  • annuler toute l'opération par un clic sur Annuler
  • remplacer le fichier déjà présent par la copie, d'un simple clic sur Ecraser
  • copier le fichier en changeant son nom : taper le nouveau nom dans la zone de texte et cliquer sur Suggérer un nouveau nom.

[modifier] Résultats nets de la copie « à la main » : comparer la copie à l'original

Si vous comparez avec soin les fichiers copiés avec les fichiers originaux, vous pourrez remarquer que :

  • les répertoires éventuellement inclus dans votre sélection initiale sont recopiés avec tout leur contenu (y compris tous leurs sous-répertoires éventuels) : la copie est donc récursive
  • les fichiers ou répertoires conservent leur horodatage (date et heure) d'origine
  • le propriétaire et le groupe propriétaire d'un fichier ou d'un répertoire copié sont conservés
  • les permissions sont maintenues
  • les liens symboliques restent des liens symboliques (et ils conservent l'adresse vers laquelle ils pointaient, qu'elle soit absolue ou - attention ! - relative).

Rien de plus naturel penserez-vous : si l'on copie quelque chose, c'est bien pour le retrouver à l'identique...

Oui… en général… mais peut-être pas toujours, comme nous le verrons à la section #cp sans option ou les mérites de la copie imparfaite.

Pour commencer, voyons comment obtenir le même résultat en ligne de commande… et pour cela rendons-nous à la section suivante.

Copie manuelle et liens en dur.
Dans ce concert de « conservatisme », une réserve cependant : la copie sous Konqueror, telle que nous venons de la décrire, ne maintient PAS la relation entre des fichiers qui sont des liens en dur pointant vers le même contenu. Les copies, obtenues de cette façon, de deux liens en durs seront des fichiers entièrement distincts sans lien entre eux (modifier l'une des deux copies ne modifiera pas le contenu de l'autre copie : les copies vivront des destins autonomes...). C'est là une différence par rapport à la commande console cp -a, qui maintient de tels liens dans les copies (à condition que les deux fichiers soient copiés en une seule commande).

[modifier] Copier avec la commande cp : les bases

[modifier] Copie en ligne de commande équivalente à une copie « graphique » : l'option -a

Comment donc, en ligne de commande, obtenir le même genre de résultat que celui obtenu sous interface graphique à la section précédente ?

Illustrons. Pour obtenir un résultat strictement identique à celui d'une copie à la main du fichier charlotte.txt dans le répertoire desserts/, vous pouvez taper en console la ligne suivante, suivie d'une pression sur la touche <ENTREE> :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a charlotte.txt desserts/

L'exécution de cette commande crée, dans le répertoire desserts/, un nouvel exemplaire de charlotte.txt

La présence de l'option -a assure le même degré de conservation des propriétés que celui que nous avons noté précédemment lors de la copie graphique. Autrement dit :

  • les répertoires éventuellement inclus dans votre sélection initiale sont recopiés avec tout leur contenu (y compris tous leurs sous-répertoires éventuels) : la copie est donc récursive
  • les fichiers ou répertoires conservent leur horodatage (date et heure) d'origine
  • le propriétaire et le groupe propriétaire d'un fichier ou d'un répertoire copié sont conservés
  • les permissions sont maintenues
  • les liens symboliques restent des liens symboliques (et ils conservent l'adresse vers laquelle ils pointaient, qu'elle soit absolue ou - attention ! - relative).


L'option -a et les liens en dur.
Lorsque deux fichiers copiés sont en fait des liens en dur pointant vers le même contenu, la commande cp -a maintient le lien entre les deux fichiers s'ils sont copiés par cp en une seule fois (par exemple par une commande comme cp -a lien1 lien2 rep/). Alors que la copie sous Konqueror, ne maintient PAS la relation entre ces fichiers : les copies faites sousKonqueror seront des fichiers entièrement distincts, sans lien entre eux (modifier l'une des deux copies ne modifiera pas le contenu de l'autre copie : les copies vivront des destins autonomes...).


Attention, pour obtenir que cp, comme le fait Konqueror, demande son avis à l'utilisateur lorsqu'un fichier de nom identique risque d'être effacé dans le répertoire de destination, il faut utiliser l'option -i, comme nous le verrons en détails plus bas.

La copie sous Konqueror se rapproche donc en fait de la commande cp employée avec les deux options -a et -i.


Que se serait-il donc passé si nous n'avions utilisé aucune option ?? C'est ce que nous verrons à la section #cp sans option ou les mérites de la copie imparfaite.

[modifier] Copier plusieurs fichiers en une seule commande

Il est aussi possible de copier en une seule fois plusieurs fichiers, en prenant soin d'indiquer en dernier le répertoire de destination, par exemple vous copieriez trois fichiers de recettes vers le même répertoire ainsi :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a charlotte.txt pet_de_nonne.txt bombe_glacee.txt desserts/


Notez bien que le nom du répertoire destination (ici desserts/) vient en dernier.


De plus, cp accepte l'expansion des noms de fichier, ce qui signifie que vous pourriez par exemple copier comme suit, en une seule commande, les fichiers : charlotte1.txt, charlotte2.txt, charlotte3.txt, charlotte4.txt (et tout autre fichier situé à la racine de votre répertoire de travail dont le nom commencerait par la suite de lettres charlotte, suivie d'un caractère, le tout suivi de .txt) :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a charlotte?.txt desserts/

Si vous voulez éviter de copier les recettes de charlotte ayant un numéro supérieur à 4 et aussi éviter de copier le fichier général charlottes.txt, vous pourriez faire :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a charlotte[1-4].txt desserts/

qui copiera exclusivement charlotte1.txt, charlotte2.txt, charlotte3.txt et charlotte4.txt, si du moins ils existent...

Vous pourriez encore copier la totalité des fichiers texte de votre répertoire de travail (s'ils ont tous l'extension .txt; ce qui sous Linux n'a rien d'obligatoire) ainsi :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a *.txt desserts/

(une manœuvre qui n'aurait pas été facile du tout à réaliser sous l'interface graphique, lors d'une copie à la main... pour peu qu'il y ait eu de nombreux fichiers de ce genre, disséminés à travers tout l'affichage du contenu du répertoire !! eh oui, la ligne de commande, cela peut parfois bien simplifier les choses, finalement !)

A ce stade, des questions vous viennent certainement à l'esprit, par exemple :

« Et que se passe-t-il si je copie un fichier dans un répertoire qui contient un fichier de même nom ? »

Nous le verrons dès la section suivante.

Ou encore :

« Nous n'avons copié que des fichiers au sens strict du terme, peut-on copier également des répertoires ? »

Evidemment oui et nous allons le voir dans les prochaines sections.

[modifier] Copier sans écraser...

Après avoir lu la section qui commence ici, vous pourrez trouver d'autres indications sur « l'écrasement » aux sections #Qu'on se le dise une bonne fois : pas d'écrasement !!, #N'écraser que les plus vieux avec -u et #Ecraser un répertoire ? Mais c'est inécrasable, ça !.

[modifier] En ligne de commande : l'option -i

Si je copie par mégarde le fichier charlotte1.txt dans un répertoire desserts/ qui contient déjà un fichier desserts/charlotte1.txt, alors, ce fichier charlotte1.txt initialement contenu dans desserts/ sera purement et simplement remplacé par le fichier copié (comme on dit : il sera « écrasé »), ce qui pourrait, bien entendu, être catastrophique...

Dans son usage « normal », c'est là ce que fait la commande cp, c'est son comportement « par défaut ».

Toutefois, il est possible d'exiger d'elle qu'elle vous demande systématiquement votre avis dans un cas de ce genre. C'est à cela que sert l'option -i. Si vous tapez :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -ai charlotte1.txt desserts/

alors, s'il existe, quand vous lancez la commande, un fichier desserts/charlotte1.txt, cp vous demandera si elle doit le remplacer. Répondez y, pour yes, si vous êtes d'accord et n, pour no, si vous ne l'êtes pas, ce qui donnera, par exemple :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -ai charlotte1.txt desserts/

cp: écraser `desserts/charlotte.txt'?y

et si vous ajoutez l'option -v qui rend la commande plus « bavarde » (anglais verbose) elle vous confirmera l'effacement, s'il a eu lieu, ainsi :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -aiv charlotte1.txt desserts/

cp: écraser `desserts/charlotte.txt'?y
`charlotte.txt' -> `desserts/charlotte.txt'

A noter que, sous la Mandriva, un alias remplace systématiquement l'exécution de cp par l'exécution de cp -i, ce qui paraît très raisonnable, une sage prudence… Si un écrasement menace, on vous demandera donc systématiquement ce qu'il faut faire.

Dans ma Mandriva, ceci est assuré par la ligne suivante de mon fichier de configuration /etc/profile.d/alias.sh :

alias cp="cp -i"


Cela dit, si, dans une circonstance particulière, vous êtes sûr de vouloir ne pas être exposé aux questions posées par cp dans de tels cas, vous pouvez vous débarrasser d'elles en tapant :

Image:Konsole.png
[utilisateur@ordi ~]$ unalias cp

La commande cp reprendra alors (mais pour la seule durée de la session du shell en cours) son comportement par défaut et écrasera, sans état d'âme et sans rien vous demander, un éventuel desserts/charlotte1.txt et tout autre fichier « écrasable » du répertoire de destination. A vous de voir ce que vous souhaitez vraiment… Pour réactiver votre alias, rien de plus simple : il vous suffira de relancer le shell, par exemple en ouvrant une autre console (et les consoles, ce n'est pas cela qui manque sous Linux...) ou en lançant la commande bash dans la console déjà ouverte.

Pour désactiver l'alias uniquement pour une certaine ligne de commande (et non pour toute la session du shell en cours), vous pouvez mettre cp entre guillemets, ainsi :

Image:Konsole.png
[utilisateur@ordi ~]$ 'cp' -a charlotte1.txt desserts/

[modifier] Dans l'interface graphique

Konqueror, lui aussi, lors d'une copie à la main, nous l'avons vu, vous pose systématiquement une question lorsqu'un écrasement se profile à l'horizon - dans une fenêtre qu'il ouvre pour la circonstance .

Une copie via Konqueror est donc essentiellement équivalente à une commande cp employée avec les deux options -ai, finalement…

[modifier] Renommer pour ne pas écraser ?

En fait, Konqueror, ici, pourrait même paraître plus efficace, plus confortable, que la ligne de commande, car non seulement il vous donne le choix d'annuler l'opération ou d'écraser le fichier, mais il vous propose aussi une troisième possibilité : renommer le fichier (copier le fichier sous un autre nom dans le répertoire de destination, sans « écraser », par conséquent, le fichier qui s'y trouvait déjà). Possibilité que l'option -i de cp ne vous propose pas directement.

Un point donc ici, peut-être, pour l'interface graphique ? Notez cependant qu'en ligne de commande après avoir répondu n à la proposition d'écrasement faite par cp vous pouvez :

  1. rappeler la ligne de commande précédente en pressant simplement la touche Flèche vers le haut (voir L'historique du shell)
  2. taper dans cette ligne le nouveau nom (ce qui est évidemment nécessaire aussi dans l'interface graphique).

Pas grande différence en rapidité, finalement : flèche vers le Haut dans un cas, clic dans une zone de la fenêtre dans l'autre, match nul ?


Après avoir lu cette section, vous pourrez trouver d'autres indications sur « l'écrasement » aux sections #Qu'on se le dise une bonne fois : pas d'écrasement !!, #N'écraser que les plus vieux avec -u et #Ecraser un répertoire ? Mais c'est inécrasable, ça !.


[modifier] A propos de répertoire...

[modifier] Copie d'un répertoire

La copie de répertoire, parfaitement possible, mérite d'être examinée avec un certain soin.

Vous pouvez copier le sous-répertoire tartes/ de votre répertoire de travail dans le répertoire desserts/, qui s'y trouve aussi, tout simplement comme ceci :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a tartes/ desserts/

le répertoire tartes lui-même et tout ce qu'il contient seront ainsi reproduits sous le répertoire desserts.


Ainsi, si vous aviez dans tartes/ un fichier tartes/tatin.txt, une copie desserts/tartes/tatin.txt existera après exécution de la commande :

  • tartes/tatin.txt -> desserts/tartes/tatin.txt (si dessert/ existe avant exécution de la commande).


Notez que c'est aussi ce que vous auriez obtenu, en déplaçant ou en copiant dans Konqueror le répertoire tartes/ dans desserts/ à la main.

Attention !

Dans cet exemple, nous avons supposé que le répertoire de destination existait déjà avant l'exécution de la commande. Si ce n'était pas le cas, cp créerait une copie de tout le contenu du répertoire tartes/ et donnerait au nouveau répertoire le nom de desserts/, dans ce cas tartes/tatin.txt se retrouverait copié en desserts/tatin.txt :

  • tartes/tatin.txt -> desserts/tatin.txt (si dessert/ n'existe pas encore quand on lance la copie)
  • tartes/tatin.txt -> desserts/tartes/tatin.txt (si dessert/ existe avant exécution de la commande).

[modifier] Copie de plusieurs répertoires (et fichiers éventuels)

Comme pour les fichiers, vous pourriez copier en une seule commande plusieurs sous-répertoires, et même y mêler des copies de fichiers, pourvu que le répertoire de destination de la copie figure en dernier.

Ainsi, la commande suivante copierait les répertoires tartes/ et glaces/ dans desserts/ et aussi le fichier charlotte1.txt :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a tartes/ glaces/ charlotte1.txt desserts/

[modifier] Et si le répertoire de destination n'existe pas ??

Que se passerait-il à votre avis, si vous vous avisiez, en ligne de commande, d'essayer de copier comme précédemment un répertoire, disons panades/, dans un répertoire soupes/ qui n'existerait pas :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a panades/ soupes/

Que se passerait-il donc ?? Rien ? une protestation véhémente du système ?

Mais non, cp crée simplement, dans des cas de ce genre, un nouvel exemplaire du premier répertoire sous un autre nom.

Attention, attention, donc, dans ce cas particulier, cp crée le répertoire soupes/ ET elle place dans ce nouveau répertoire non pas panades/ mais uniquement son contenu ! Ainsi, s'il existait un fichier panades/auvergnate.txt, eh bien, après la copie, il y aura un fichier soupes/auvergnate.txt (et non pas soupes/panades/auvergnate.txt ! vous saisissez bien la nuance...).

Dans ce cas, un nouveau répertoire est créé qui a le même contenu que panades/ et l'expérience montre que c'est bien souvent ce qu'on souhaite dans une telle circonstance.

C'est là quelque chose qui n'a pas de véritable équivalent dans la copie par interface graphique.

Cette utilisation de cp peut être particulièrement naturelle lorsque l'on souhaite « mettre à l'abri » temporairement le contenu d'un répertoire avant quelque manipulation un peu risquée. Par exemple, pour mettre à l'abri le contenu de votre répertoire Documents/ avant un bidouillage hardi, vous pourriez en faire une copie exacte sous le nom de DocumentsVieux, qui pourra faire office de sauvegarde, en lançant la commande ainsi :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a ~/Documents ~/DocumentsVieux


Notez que le répertoire créé peut être plus ou moins profondément « enfoui » dans l'empilement (la « hiérarchie ») des répertoires et sous-répertoires. Si, par exemple, dans votre répertoire de travail existe une hiérarchie de répertoires hiver/diner ne contenant aucun sous-répertoire portant le nom de soupes, la commande :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a panades/ hiver/diner/soupes/


créerait le sous-répertoire soupes/ et y copierait le contenu de panades/.

MAIS… Attention tout de même à ce qui suit…

[modifier] Et si l'arborescence de destination n'existe pas ??

La commande cp ne peut pas créer en une seule fois toute une hiérarchie de répertoires emboîtés les uns dans les autres.

S'il se trouve que dans votre répertoire de travail il n'existe aucun répertoire nommé hiver/, alors, si vous lancez la commande (identique à celle que nous venons de mentionner à la section précédente, mais dans un autre contexte) :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a panades/ hiver/diner/soupes/

dans l'espoir de créer et le répertoire hiver/ et son sous-répertoire diner/ et finalement le sous-répertoire soupes/ en une seule ligne de commande, pour y copier le contenu de panades/, alors tout ce que vous obtiendrez, dans ce contexte particulier, sera un message d'erreur...

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a panades/ hiver/diner/soupes

cp: ne peut créer le répertoire `hiver/diner/soupes': Aucun fichier ou répertoire de ce type

Que faire dans ce cas ?

Une façon de s'en sortir pourrait être ceci.

Créer une arborescence à l'aide de la commande de création de répertoire mkdir assortie de l'option -p qui lui permet de créer les répertoires parents si nécessaire :

Image:Konsole.png
[utilisateur@ordi ~]$ mkdir -p hiver/diner/

ensuite il suffira de faire :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a panades/ !$soupes/

et le tour sera joué… Eh mais, qu'est-ce que ce !$ ??? Simplement une astuce élégante de la ligne de commande qui permet de récupérer le dernier argument de la ligne de commande précédente sans avoir besoin de le taper (voir L'historique du shell), cette commande n'est donc, dans le contexte particulier de notre exemple, qu'une simple abréviation de :

Image:Konsole.png
[utilisateur@ordi ~]$ cp -a panades/ hiver/diner/soupes/

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

Nous avons vu dans les sections précédentes :

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 fichier. 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 :

Image:Konsole.png
[utilisateur@ordi ~]$ 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 !).

[modifier] Des options indispensables pour copier des répertoires...

Notez bien la présence de l'option -a dans toutes les commandes des cinq sous-sections qui précèdent… Comme nous le verrons plus loin, cela fonctionnerait aussi avec l'option -R (voire -r), mais sinon… non : pour copier des répertoires l'une ou l'autre des options -a ou -R (éventuellement -r) est absolument indispensable !

[modifier] Créer par copie un nouvel exemplaire d'un fichier « au même endroit »

Dans toutes les sections qui précèdent nous avons vu comment copier fichiers ou répertoires dans un répertoire différent du répertoire d'origine du (ou des) fichier(s)/répertoire(s) copié(s).

En conséquence, toutes nos lignes de commandes se terminaient par l'indication du répertoire de destination où devait être créée la nouvelle copie.

Mais que se passerait-il si le dernier argument passé à la commande cp, l'argument qui figure en fin de ligne, était non plus un nom de répertoire mais un nom de fichier ? Message d'erreur ? Blocage silencieux de la commande ??

Non, non, dans ce cas, il pourrait y avoir création d'une nouvelle copie d'un fichier, dotée d'un nom différent de celui du fichier original.

Par exemple, si vous envisagez d'élaborer une recette de charlotte personnelle à partir de la description classique contenue dans charlotte1.txt, vous pourriez avoir envie de créer un fichier nouveau qui abritera votre recette mise au point à partir du texte précédent et cela tout en conservant par devers vous, au moins pour un certain temps le texte de départ, pour référence… Vous pourriez alors taper ceci :

cp charlotte1.txt ma_charlotte.txt

immédiatement après l'exécution de la commande vous disposerez donc de deux exemplaires du fichier de recette, au contenu identique mais portant des noms distincts : charlotte1.txt, qui reste présent, et le nouveau ma_charlotte.txt. Notez bien que ces fichiers sont maintenant complètement séparés : ils pourront acquérir par la suite des contenus et des propriétés complètement différentes. Il n'y a plus aucun lien entre eux. La situation est à cet égard complètement différente de ce qui se serait passé si vous aviez créé un lien en dur

Attention à l'écrasement

Si, dans l'exemple qui précède, il se trouvait que votre répertoire de travail contienne déjà, avant le lancement de la commande, un fichier nommé ma_charlotte.txt, ce fichier courrait le risque de disparaître complètement et définitivement, en d'autres termes d'être « écrasé ». Pour découvrir les précautions à prendre afin d'éviter l'écrasement non désiré de fichiers par la commande cp, voir la section #Copier sans écraser...

Le lecteur attentif n'aura pas manqué de noter que la commande qui nous a servi d'exemple est dépourvue d'option. On n'y retrouve pas la sempiternelle option -a que nous avions introduite dans tous les exemples de toutes les sections qui précèdent. Pourquoi ? Pour changer un peu… et aussi parce que dans ce cas particulier cela pourrait être particulièrement naturel. Mais il n'y a rien là d'obligatoire : l'option -a serait parfaitement possible dans ce cas aussi. Pour les différences sur le fichier ou répertoire copié qu'entraîne la présence ou l'absence de l'option -a, voir… #cp sans option ou les mérites de la copie imparfaite.

Renommer

Rappel : si vous voulez seulement renommer un fichier, sans en créer une copie supplémentaire, vous pouvez faire usage de la commande mv :

mv charlotte1.txt ma_charlotte.txt

changerait simplement le nom du fichier charlotte1.txt qui deviendrait ma_charlotte.txt. Pour plus de détails sur mv (et sur les ressemblances et différences entre cp et mv), voir Déplacement de fichiers ou de répertoires.

[modifier] Copier avec la commande cp : utilisation avancée

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

On peut parfois avoir besoin d'effectuer une copie du contenu d'un répertoire a vers un répertoire b en procédant de telle sorte que seuls les fichiers de a qui n'existent pas dans b soient copiés. Autrement dit, aucun fichier de b ne devra être écrasé (même si une version plus récente du fichier existe dans a). Il s'agira donc d'apporter un simple complément à b, sans rien modifier de ce qu'il contient avant copie.

On pourrait bien entendu obtenir cela en forçant cp à vous demander systématiquement votre avis, grâce à l'option -i (et à l'alias de Mandriva qui remplace cp par cp -i), me direz-vous. Certes. Mais imaginez qu'il y ait un très grand nombre de fichiers « écrasables » dans b… 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 (futur lien) la conversion de man en Latin1.

[modifier] N'écraser que les plus vieux avec -u

[modifier] Description de l'option

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, une date postérieure à celle du fichier correspondant 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.

[modifier] 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.

Dans ce type d'emploi, -u peut présenter l'avantage de ne pas remplacer inutilement des fichiers qui n'ont pas été modifiés. Economise, de ce fait, du temps et aussi de l'usure des organes mécaniques de l'ordinateur, 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. Elle évite aussi d'écraser un fichier qui aurait été modifié (par accident ?) directement sur la destination.

[modifier] 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 de telle 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/

(sur le symbole && voir Le shell sans peine#Enchaînement de commandes).


Ce dernier emploi correspond à la préférence force = newer du logiciel de synchronisation et de sauvegarde Unison.


[modifier] 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.

[modifier] 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 la section #Copier sans écraser...).

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 la section #Copier sans écraser...).

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 effectuez 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 (futur lien), et pour le sens du symbole point-virgule (;), voir Le shell sans peine#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.

[modifier] Créer un fichier de sauvegarde avec cp : l'option -b

Dans un système Linux, il est parfaitement possible de faire coexister deux fichiers de même nom, pourvu qu'ils soient situés dans des répertoires différents. Vous pouvez parfaitement avoir sur votre système, par exemple, un fichier ~/recettes/toto/charlotte.txt et un autre fichier ~/recettes/julie/charlotte.txt susceptible de contenir une recette complètement différente… Mais à la racine d'un même répertoire, il est impossible d'avoir deux fichiers de même nom, même avec des contenus ou des propriétés différentes. C'est pour cette raison qu'une commande comme la suivante, qui tenterait de « copier un fichier sur lui-même » :

cp charlotte.txt  charlotte.txt

ne pourra pas être exécutée et provoquera, sur la Mandriva, l'affichage d'un message d'erreur.

En insistant vraiment...

Toutefois, en y ajoutant la combinaison d'options -b et --force, la commande précédente deviendrait exécutable :

cp -b --force charlotte.txt  charlotte.txt

elle provoquerait simplement la création d'une copie de « sauvegarde » du fichier, dont le nom serait formé du nom du fichier suivi d'un tilde (dans notre exemple : charlotte.txt~). Très utile pour créer par précaution une sauvegarde d'un fichier avant de de le modifier.

Plus généralement, si vous ajoutez l'option -b à une commande cp, cela vous permettra de créer une copie de sauvegarde chaque fois que vous autoriserez cp à écraser un fichier.

Par exemple, les deux commandes suivantes autoriseront l'écrasement sans avertissement mais pour tout fichier écrasé une sauvegarde sera créée :

unalias cp
cp  -ab  panades/*  soupes/

(pour le rôle de la commande unalias, voir cette section).

[modifier] cp sans option ou les mérites de la copie imparfaite

[modifier] Introduction

Une caractéristique un peu déroutante de la commande cp, peu signalée explicitement dans les documentations pour débutants, est le fait que pour qu'elle copie un fichier ou un répertoire avec la totalité de ses propriétés, ce qui pourrait paraître l'emploi le plus neutre, le plus « normal » de la chose, eh bien, il faut lui ajouter une option : l'option -a (ou éventuellement un ensemble d'options équivalentes comme nous le verrons).

Avec cette option les copies créées doivent respecter les cinq points suivants :

  1. les répertoires éventuellement inclus dans votre sélection initiale sont recopiés avec leur contenu
  2. les fichiers ou répertoires conservent leur horodatage (date et heure) d'origine
  3. le propriétaire et le groupe propriétaire du fichier ou du répertoire copié sont conservés
  4. les permissions sont maintenues
  5. les liens symboliques restent des liens symboliques (et ils conservent l'adresse vers laquelle ils pointaient, qu'elle soit absolue ou relative)
  6. les liens en dur passés en argument restent liés.

Mais si l'on emploie cp sans l'option -a (et sans le paquet d'options équivalent que nous verrons plus tard), alors plus rien n'est garanti en ce qui concerne le respect de ces six exigences !

Il est très important d'avoir bien cela en tête quand on utilise cette commande.

La copie est alors « imparfaite ».

Et pourtant, dans bien des cas, cette copie « imparfaite » peut être utile, comme nous allons le voir dans les sous-sections qui suivent.

[modifier] Copier uniquement les fichiers qui sont à la racine d'un répertoire

Si vous utilisez cp sans l'option -a (et sans l'option -R (ou -r)), aucun répertoire ou sous-répertoire ne sera copié. Vous ne pourrez copier que de simples fichiers.

Voici un exemple où ce type de copie peut être utile.

Il peut arriver que les fichiers vraiment importants d'un répertoire soient ceux qui sont « à sa racine », d'autres fichiers moins essentiels ou « spéciaux » étant alors réunis dans un petit nombre de sous-répertoires (anciennes versions obsolètes des fichiers actifs, fichiers en cours d'élaboration, archives à consulter pour élaborer ou comprendre les fichiers actifs...). Par exemple, dans un répertoire recettes/ vous pourriez avoir placé à la racine des fichiers textes de recettes bien au point, après avoir créé, disons, un répertoire pour les recettes obsolètes : recettesVieilles/, un autre pour les recettes en cours d'élaboration : encours/ et un autre, qui serait une archive à consulter, pour des informations sur les ingrédients : ingrédients/. Si vous souhaitez copier les recettes « actives », et elles seules, dans un répertoire partagé par tous les utilisateurs : /home/partage_recettes, vous pourrez faire ceci (en supposant que recettes/ est votre répertoire de travail) :

cp  *  /home/partage_recettes/

Toutes les recettes, telles que charlotte1.txt etc. seront copiées mais aucun des trois sous-répertoires (pas plus que leur contenu) : encours/, ingrédients/, et recettesVieilles/ ne le sera.

Il est crucial ici que l'option -a soit absente, ainsi que l'option -R (ou -r).

Une telle copie, qui ne porte sur aucun sous-répertoire, est appelée copie non récursive. Une copie récursive copie les sous-répertoires et leur contenu. Des exemples de copie récursive avec -a sont donnés à la section #A propos de répertoire... et des exemples avec -R à la section #L'option -R.

[modifier] Copier en changeant l'identité du propriétaire et du groupe propriétaire ainsi que l'horodatage


Lorsque cp est employée sans l'option -a (et aussi sans l'option -p que nous verrons plus loin) le propriétaire et le groupe du fichier copié seront ceux de l'utilisateur qui a effectué la copie. En outre l'horodatage de la copie indiquera le moment de création de la copie et non l'heure et la date associés au fichier original.

Voyons un exemple où ce type de copie peut être utile.

Supposons que vous ayez besoin de copier un ensemble de fichiers qui figurent dans un sous-répertoire de l'utilisateur anne, pour faire de la version ainsi copiée votre bien propre. Vous souhaiterez sans doute en devenir propriétaire et faire de votre groupe principal le groupe des fichiers copiés. Vous souhaiterez peut-être aussi que la date et l'heure indiquée pour ces fichiers soient ceux de leur entrée dans votre univers et non celle de leur création par anne. Rien de plus facile. Vous pourrez obtenir automatiquement ce résultat en omettant l'option -a (et l'option -p) :

cp /home/anne/Documents/notules/* /home/toto/Documents/notes

Vous avez ainsi en un tournemain, effectué la copie de tous les fichiers qui sont à la racine du répertoire notules/ de anne et dans le même temps modifié propriétaire et groupe propriétaire, ainsi que l'horodatage, de tous les fichiers reproduits.

Ainsi un fichier d'origine qui serait :


-rw-r--r-- 2 anne anne 48013 aoû 1 2005 Interrogatifs_chinois.odt


pourra avoir une version copiée par l'utilisateur toto comme :


-rw-r--r-- 2 toto toto 48013 fév 24 18:12 Interrogatifs_chinois.odt


(bien entendu, pour que cet exemple fonctionne, il est nécessaire que vous disposiez des droits nécessaires pour copier les fichiers de votre amie anne, mais ceci est une autre histoire...)

[modifier] Copier en changeant les permissions

Lorsque cp est employée sans l'option -a (et aussi sans l'option -p que nous verrons plus loin), alors les permissions du fichier créé peuvent être différentes de celles du fichier d'origine, en fonction du (futur lien) masque de permissions par défaut (umask) de l'utilisateur qui effectue la copie.

Chaque utilisateur possède un masque de permissions par défaut qui intervient lorsque vous créez un fichier et qui dépend du niveau de sécurité que vous avez choisi dans msec. Par exemple, pour ma part, lorsque je crée un petit fichier à l'aide de la commande touch, comme ceci :

touch textule

ce fichier, dans mon système, est créé automatiquement avec les permissions suivantes :

-rw-r--r--

Lorsque vous copiez un fichier avec cp sans l'option -a et sans l'option -p, certains changements de permission pourront parfois avoir lieu. Ces changements dépendent en partie de votre umask.

Ainsi un fichier auquel j'aurais attribué (peut-être imprudemment) les permissions très larges suivantes :

-rw-rw-rw-

se retrouvera, dans sa version copiée sans l'option -a et sans l'option -p, avec les permissions plus raisonnables (et dans ce cas particulier identiques à celles de mon umask) suivantes :

-rw-r--r--

[modifier] Copier des liens symboliques

[modifier] Le lien symbolique copié reste un lien symbolique...


Si vous faites une copie, avec la commande cp, en utilisant l'option -a que nous avons illustrée abondamment dans les sections qui précèdent (mais aussi en utilisant l'une ou l'autre des options : -P (attention : il s'agit bien ici d'un P majuscule), -R (ou -r) ou -d), la copie d'un lien symbolique sera elle-même un lien symbolique pointant vers le même chemin que celui vers lequel pointait le lien original.

Si vous faites, par exemple, une copie d'un de vos répertoires contenant un lien symbolique dans le répertoire d'un autre utilisateur, il se peut que vous ayez envie que ce lien symbolique soit conservé comme lien dans la copie, afin qu'il continue à pointer vers le fichier de référence.

Quand on copie des liens il faut « faire un peu attention »…

Si, par exemple, vous copiez, avec l'option -a, -P, -R ou -d, un certain répertoire sur un disque amovible, n'oubliez pas que si ce répertoire contient un lien qui pointe vers un fichier extérieur au répertoire copié, vous ne retrouverez pas l'usage du fichier en question quand vous grefferez votre disque amovible sur un autre système, du moins dans le cas général... Trivial, mais il ne faut pas oublier d'y penser !


[modifier] Le lien symbolique copié devient un fichier « normal »

Mais il est aussi des cas où vous préférerez sûrement qu'un lien ne reste pas un lien, précisément pour éviter les difficultés signalées dans l'encadré qui précède.

C'est ce qui se passera si vous lancez cp sans option (ou avec l'option -L). En procédant ainsi, la commande cp « suivra les liens », comme on dit dans ce cas, ce qui signifie que ce qui sera copié sera un fichier portant le même nom que le lien copié mais doté du contenu du fichier vers lequel pointait le lien d'origine...

Par exemple, si vous copiez, sur une clé USB ou sur un disque dur externe, un répertoire contenant un lien vers un fichier extérieur au répertoire copié, si vous voulez pouvoir disposer du fichier sur la clé, ou sur le disque, quand vous serez en déplacement, il faudra bien cette fois que vous copiiez le fichier lui-même, et non un simple lien. Vous pourrez pour cela lancer une commande de ce genre :

cp ~/Documents/poemes/*  /mnt/DISKUSB2.0

qui, comme on le sait depuis la section #Copier uniquement les fichiers qui sont à la racine d'un répertoire, copiera les fichiers à la racine de ~/Documents/poemes sur la clé USB.

Un éventuel lien symbolique ~/Documents/poemes/cygne, pointant, par exemple, vers le texte d'un poème, deviendra alors, sur la clé DISKUSB2.0, un véritable fichier texte, qui contiendra toutes les données incluses dans le fichier texte vers lequel pointait le lien symbolique cygne de votre disque dur. Vous pourrez donc relire le poème à loisir lorsque vous serez loin, au lieu de vous retrouver avec un lien pointant désespéremment dans le vide...

En matière de copie de liens, à vrai dire, on a surtout le choix entre différents inconvénients.

Le type de copie mis en œuvre ici évite les inconvénients mentionnés dans le précédent encadré, mais… si d'aventure parmi les fichiers copiés plus d'un lien pointent vers le même fichier vous vous retrouverez avec plusieurs copies d'un même fichier original. Une situation qui d'une part peut consommer beaucoup d'espace disque et d'autre part peut créer des difficultés si vous souhaitez modifier le contenu du fichier… A vous donc de bien réfléchir à ce que vous souhaitez faire.

Sur les questions abordées dans cette page, voir aussi la section #Décomposer l'option -a : Les options -p, -d, -R, -P, -L et --preserve=.

[modifier] Copier des liens en dur

[modifier] Copier sans maintien du lien

En général, lorsqu'on copie des liens en dur, tout se passe comme pour un fichier « normal » : le fichier copié est complètement distinct du fichier d'origine.

Supposons que nous possédions dans un certain répertoire le fichier charlotte3.txt et un lien en dur best_charlotte créé à partir de ce fichier :

1606777 -rw-r--r--  2 toto toto  3407 fév 27 12:57 best_charlotte
1606777 -rw-r--r--  2 toto toto  3407 fév 27 12:57 charlotte3.txt

Si maintenant nous copions ces deux fichiers sans utiliser d'option :

cp best_charlotte charlotte3.txt /home/partage/

on trouvera dans /home/partage après copie quelque chose comme ceci (obtenu par une commande ls lancée avec l'option -i) :

1610533 -rw-r--r--  1 toto toto  3407 fév 28 07:49 best_charlotte
1610467 -rw-r--r--  1 toto toto  3407 fév 28 07:49 charlotte3.txt

où les numéros d'inode des fichiers sont distincts, ce qui montre bien qu'il s'agit de fichiers distincts, qui pourront être modifiés ou effacés tout à fait indépendamment l'un de l'autre.

[modifier] Copier en maintenant le lien

Si l'on passe deux ou plusieurs liens en dur d'un même fichier en argument à cp avec l'option -a (ou avec l'option -d), alors le lien se maintient entre les copies. Dans le même répertoire de travail qu'au paragraphe précédent, lançons par exemple :

cp -a best_charlotte charlotte3.txt /home/partage/

dans ce cas, la copie aboutira à la création dans /home/partage/ d'un nouveau fichier doté de deux « noms » :

1610568 -rw-r--r--  2 toto toto  3407 fév 27 12:57 best_charlotte
1610568 -rw-r--r--  2 toto toto  3407 fév 27 12:57 charlotte3.txt

best-charlotte et charlotte3.txt sont alors deux noms d'un même fichier (comme le montre le fait qu'ils ont le même numéro d'inode, affiché grâce à un ls -i), distinct bien entendu du fichier d'origine (qui n'a pas le même numéro d'inode).

[modifier] Décomposer l'option -a : Les options -p, -d, -R, -P, -L et --preserve=

[modifier] Introduction

Nous avons vu précédemment que fournir l'option -a à la commande cp entraînait six conséquences sur les résultats de l'opération de copie :

  • 1. les répertoires éventuellement inclus dans votre sélection initiale sont recopiés avec leur contenu
  • 2. les fichiers ou répertoires conservent leur horodatage (date et heure) d'origine
  • 3. (futur lien) le propriétaire et le groupe propriétaire du fichier ou du répertoire copié sont conservés
  • 4. (futur lien) les permissions sont maintenues
  • 5. les liens symboliques restent des liens symboliques (et ils conservent l'adresse vers laquelle ils pointaient, qu'elle soit absolue ou relative)
  • 6. les liens en dur passés en argument restent liés.

En revanche aucune de ces six propriétés n'est plus garantie en l'absence de l'option -a.

Naturellement, on peut imaginer des situations où un utilisateur ou un programmeur souhaite quelque chose de moins brutal qu'un choix entre toutes ces caractéristiques de la copie et aucune d'entre elles !

Il existe pour répondre à ce type de besoin des options plus « fines », quasi « atomiques », ne reprenant qu'une part de l'option « moléculaire » -a. Nous décrirons dans ce qui suit les options de ce type suivantes :

-p, -d, -R

Des options plus fines encore, les particules « subatomiques » du monde des options de cp, sont disponibles, nous décrirons les suivantes :

-P, -L, --preserve=[ATTRIBUT]

Et notons pour commencer cette « formule de la chimie des options » dont vous pourrez vérifier l'exactitude en lisant cette page :

-a = -dpPR

[modifier] Les options « atomiques »

[modifier] L'option -p

Cette option permet de conserver à travers la copie :

1. les permissions du fichier ou du répertoire

2. le propriétaire et le groupe propriétaire

3. l'horodatage

Un exemple d'emploi pourrait être :

cp -p * /home/partage

qui copierait tous les fichiers situés à la racine du répertoire de travail dans /home/partage en conservant permissions, propriétaires et horodatages.

L'option -p peut être appropriée lorsque vous créez une sauvegarde d'un fichier que vous allez ensuite modifier. Vous en trouverez un exemple ici.

[modifier] L'option -d

Cette option permet de :

1. maintenir à travers la copie la relation entre deux ou plusieurs liens en dur passés en argument à la commande cp. Voir là-dessus Copier des liens en dur en maintenant le lien.

2. copier les liens symboliques comme des liens symboliques. Voir là-dessus #Copier des liens symboliques.

[modifier] L'option -R

Cette option implique :

  • la copie « récursive » des répertoires et sous-répertoires et de leur contenu.

En outre par défaut elle implique aussi :

Si votre répertoire de travail contient un répertoire desserts/, la commande :

cp -R tartes/ desserts

y copiera le répertoire tartes/ avec tout ce qu'il contient, y compris ses sous-répertoires. De plus d'éventuels liens symboliques seront copiés comme des liens.

La seconde propriété (copie des liens symboliques comme liens) peut être supprimée en utilisant avec -R l'option -L qui impose le « suivi » des liens symboliques : si cp est employée avec -RL, les liens symboliques seront copiés comme des fichiers ayant le nom du lien copié mais le contenu du fichier vers lequel pointait le lien d'origine.

Problèmes de portabilité (pour les programmeurs) Sous Mandriva et la plupart des Linux -r est l'exact synonyme de -R. Toutefois sous certains Unix -r peut par défaut suivre les liens symboliques à la différence de -R.

Il semble aussi que sur certains systèmes Unix -R permette par défaut le suivi des liens symboliques. Si on veut être sûr que cela ne sera pas le cas, on peut alors avoir recours à -RP, qui est toujours possible.

[modifier] Les options « subatomiques »

[modifier] L'option -P

Cette option impose la copie des liens symboliques en tant que liens (voir là-dessus #Copier des liens symboliques).

cp -P ~/Documents/poemes/*  /mnt/DISKUSB2.0

copierait sur la clé USB DISKUSB2.0 tous les fichiers situés à la racine de ~/Documents/poemes de telle façon que tous les liens symboliques copiés conservent sur la clé leur statut de liens symboliques.

[modifier] L'option -L

Cette option impose à cp de « suivre les liens symboliques » : dans ce cas la copie est un fichier qui porte le nom du lien mais qui a le contenu du fichier vers lequel le lien d'origine pointait. Pour un type d'emploi de cette option voir plus haut la section sur #L'option -R.

[modifier] L'option preserve=

Cette option prend diverses « valeurs » appelées des « attributs » qui chacun imposent une certaine contrainte à l'opération de copie. Voici la liste des attributs possibles :

  • mode : impose la conservation des permissions (y inclus les (futur lien) ACL)
  • ownership : préserve le propriétaire et le groupe propriétaire du fichier
  • timestamps : préserve l'horodatage
  • links : préserve les liens entre 'noms' d'un même fichier (liens en dur) passés en argument
  • all : équivalent à l'ensemble des attributs précédents

Par exemple une préservation de l'horodatage pourra être obtenue ainsi :

cp --preserve=timestamps piment condiments/

et pour imposer une préservation de l'horodatage et des propriétaires on pourra taper :

cp --preserve=timestamps --preserve=ownership piment condiments/

[modifier] Conclusion

Pour finir, vérifiez donc, maintenant que vous avez tous les éléments pour le faire, la validité de la « formule » donnée plus haut :

-a = -dpPR

… et vérifiez aussi la validité de ces nouvelles formules de la chimie des options :

-p = --preserve=mode --preserve=timestamps -- preserve=ownership
-d = -P -- preserve=links

[modifier] Copier les points de montage sans leur contenu : l'option -x

Si vous lancez une copie « récursive » (avec l'option -a ou l'option -R), l'option -x vous permet d'éviter de copier le contenu de vos points de montage, tout en permettant la copie des points de montage eux-mêmes.

Par exemple, si vous souhaitez copier sur votre clé USB l'ossature de votre répertoire /mnt, autrement dit l'ensemble des points de montage qu'il contient mais non leur contenu, vous pouvez faire quelque chose comme ceci :

cp -ax /mnt      /mnt/CLE_USB/

Si le répertoire mnt/ n'existe pas sur votre clé USB, il sera créé avec tous les points de montage que contient /mnt, mais sans leur contenu. Sur la clé USB, les répertoires de mnt/ qui, sur votre disque dur d'origine, font office de points de montage seront donc des répertoires vides.

Donnons encore un exemple.

Si vous avez une partition Windows sur votre système et si vous avez monté cette partition dans votre répertoire /home/toto/Documents (en supposant que vous êtes l'utilisateur toto) - par exemple dans le point de montage /home/toto/Documents/Windows, alors vous pourrez copier tout le contenu de /home/toto/Documents sans copier pour autant le contenu de la partition Windows en faisant :

cp -ax /home/toto/Documents   /mnt/CLE_USB

[modifier] Autres techniques de copie

Copie par blocs d'octets avec dd

Copier-coller

Copie avec (futur lien) tar.



Cette page a été migrée depuis l'ancienne base de connaissance : http://club.mandriva.com/xwiki/bin/view/KB/CP-1