cp -L vs. cp -H


47

Problème

En copiant des fichiers avec cp -Hou cp -L, j'obtiens 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 décrit ici les deux options comme similaires, sauf si elles étaient utilisées en combinaison avec -R. Pas pour moi. Les fichiers à liaison fixe deviennent des copies renommées des fichiers vers lesquels ils pointent.
 

Question :

Quel est le bon usage de cp -Het cp -L? Est-ce le comportement attendu?


  Ma tentative de résoudre : man cpme dit tout à fait la même chose pour les deux options, mais info cpde » la formulation rend encore plus déroutant pour moi. Peut-être que l'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 sur 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 une contradiction: je suppose que «la nature d’un lien symbolique » c’est qu’elle pointe quelque part…

-L, --dereference Suivez les liens symboliques lorsque vous les copiez. Avec cette option, cpvous ne pouvez 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 ordinaire, mais… j'avoue que je suis dépassé par cette explication ici.


Courez info cp, cherchez -R. Il dit Copy directories recursively. Mais vous testez avec des non-annuaires. La différence est de ce qui est dans les répertoires que vous copiez, pas les arguments de ligne de commande.
Mikel

@ Mikel J'ai essayé de copier le contenu des répertoires et de copier les répertoires avec le contenu eux-mêmes et j'ai obtenu les mêmes résultats. De plus, je me suis assis assez longtemps devant info cpet je me suis efforcé de comprendre la signification du choix des mots pour cette option & ndash; et à propos de cette publication. L’affichage contient également le libellé actuel de info cp- c’est
pourquoi

Réponses:


56

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

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

Dire que -H"préserve sa nature" n'est pas une contradiction. Considérez l'alternative. Si vous utilisez -L, tous les liens symboliques trouvés cpseront ouverts et leur contenu copié dans le nom du fichier cible. Donc, la source était un lien symbolique, mais sa copie n'est pas un lien symbolique. Donc, il "a perdu sa nature en tant que 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  

Excellente réponse: j'aime la façon dont vous illustrez les options. Cela ne répond pas tout à fait à ma question, qui concerne la copie de liens symboliques vers des répertoires frères, mais vous avez clairement expliqué comment je peux faire une expérience rapide pour le découvrir. 😉
Michael Scheper

1
Ah, il s'avère que ce que je voulais vraiment savoir, c'était ceci: superuser.com/a/138594/219388
Michael Scheper

19

La différence de comportement entre -Let -Hvient quand -rest également spécifiée. cpne créera pas de liens symboliques dans des sous-répertoires avec -L -rmais le fera si vous utilisez -H -r.


cp: les options -H, -L et -P ne peuvent pas être spécifiées avec l'option -r.
3z33etm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.