cp-L vs.

cp-L vs.

Problema

Ao copiar arquivos com cp -Hou cp -L, obtenho os mesmos resultados:

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

Esta resposta aquidescreve ambas as opções como semelhantes, A MENOS que sejam usadas em combinação com -R. Não para mim. Os arquivos soft-as hardlinked tornam-se cópias renomeadas dos arquivos para os quais apontam na origem.
 

Pergunta:

Qual é o uso adequado de cp -He cp -L? Este é o comportamento esperado?


  Minha tentativa de resolver: man cpme diz exatamente o mesmo para ambas as opções, mas info cpéredaçãotorna tudo ainda mais confuso para mim. Talvez alguém possa me ajudar a decompor isso um pouco:

-H Se um argumento de linha de comando especificar um link simbólico, entãocopie o arquivo para o qual ele aponta em vez do link simbólicoem si. No entanto,copiar (preservando sua natureza) qualquer link simbólicoque é encontrado por meio de travessia recursiva.

Isso me parece uma contradição: acho que »a natureza de um link simbólico« é que aponta para algum lugar…

-L, --dereference Siga links simbólicos ao copiar deles. Com esta opção, cpnão é possível criar um link simbólico. Por exemplo, um link simbólico (para um arquivo normal) na árvore de origem será copiado para um arquivo normal na árvore de destino.

Eu sei que um link simbólico não é um arquivo normal, mas… admito que estou muito desafiado com esta explicação aqui.

Responder1

Com links simbólicos, as ferramentas têm duas coisas que podem fazer:

  1. Trate o link simbólico como um link simbólico ("preservando sua natureza"), ou
  2. Trate o link simbólico como o tipo de arquivo para o qual ele aponta.

Dizer que -H“preserva a sua natureza” não é uma contradição. Considere a alternativa. Se você usar -L, todos os links simbólicos cpencontrados serão abertos e seu conteúdo copiado para o nome do arquivo de destino. Portanto, a fonte era um link simbólico, mas sua cópia não é um link simbólico. Portanto, "perdeu sua natureza de link simbólico".

Considerar

$ 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  

Responder2

A diferença de comportamento entre -Le -Hocorre quando -rtambém é especificada. cpnão criará links simbólicos em subdiretórios, -L -rmas criará se você usar -H -r.

informação relacionada