web-dev-qa-db-fra.com

cp -L contre cp -H

Problème

Lors de la copie de fichiers avec cp -H ou cp -L, J'ai les mêmes résultats:

$ ls -l fileA
  fileA -> fileB
$ cp fileA somewhere/ -H
$ ls -l somewhere/
  fileA     # fileA is a copy of fileB, only renamed, with same properties!

Cette réponse ici décrit les deux options comme UNLESS similaires utilisées en combinaison avec -R. Pas pour moi. Les fichiers sous forme de liens physiques deviennent des copies renommées des fichiers vers lesquels ils pointent à la source.

Question :

Quelle est la bonne utilisation de cp -H et cp -L? Est-ce le comportement attendu?


Ma tentative de résolution : man cp me dit la même chose pour les deux options, mais info cp's libellé rend cela encore plus déroutant pour moi. Peut-être qu'on peut m'aider à décomposer un peu ceci:

-H Si un argument de ligne de commande spécifie un lien symbolique, copiez le fichier vers lequel il pointe plutôt que le lien symbolique lui-même. Cependant, copiez (en préservant sa nature) tout lien symbolique rencontré lors d'une traversée récursive.

Cela me semble être une contradiction: je suppose que " la nature d'un lien symbolique" c'est qu'il pointe quelque part…

-L, --dereference Suivez les liens symboliques lors de la copie à partir d'eux. Avec cette option, cp ne peut pas créer de lien symbolique. Par exemple, un lien symbolique (vers un fichier normal) dans l'arborescence source sera copié dans un fichier normal dans l'arborescence de destination.

Je sais qu'un lien symbolique n'est pas un fichier normal, mais… j'avoue que je suis surchargé par cette explication ici.

49
erch

Avec les liens symboliques, les outils peuvent faire deux choses:

  1. Traitez le lien symbolique comme un lien symbolique ("en préservant sa nature"), ou
  2. Traitez le lien symbolique comme le type de fichier vers lequel il pointe.

Dire que -H "conserve sa nature" n'est pas une contradiction. Considérez l'alternative. Si tu utilises -L, tous les liens symboliques cp seront ouverts et leur contenu copié dans le nom du fichier cible. La source était donc un lien symbolique, mais sa copie n'est pas un lien symbolique. Il a donc "perdu sa nature de lien symbolique".

Considérer

$ mkdir subdir
$ echo "some contents" > subdir/file
$ ln -s file subdir/link

# definition of "list", the abbreviated ls -l output used below
$ list() { ls -l "$@" | \
    awk '$0 !~ /^total/ { printf "%s %s\t%s %s %s\n", $1, $5, $9, $10, $11 }' ; }

$ list subdir
-rw-rw-r-- 14   file  
lrwxrwxrwx 4    link -> file

$ cp -rH subdir subdir-with-H
$ list subdir-with-H
-rw-rw-r-- 14   file  
lrwxrwxrwx 4    link -> file

$ cp -rL subdir subdir-with-L
$ list subdir-with-L
-rw-rw-r-- 14   file  
-rw-rw-r-- 14   link  
65
Mikel

La différence de comportement entre -L et -H vient quand -r est également spécifié. cp ne créera pas de liens symboliques dans les sous-répertoires avec -L -r mais ce sera le cas si vous utilisez -H -r.

21
Kyle Jones