Recentemente experimentei o comando cp e percebi o seguinte:
Vamos supor que temos uma pasta foo
contendo o arquivo bar
e o link simbólico l-bar
:
foo
|-- bar
|-- lbar -> bar
Ao copiar lbar
com o padrão cp lbar copy-lbar
, obtemos
foo
|-- bar
|-- copy-lbar
|-- lbar -> bar
onde copy-lbar
é um arquivo normal, contendo o conteúdo original de bar
. copy-lbar
não está vinculado de forma alguma a bar
ou lbar
. Ao usar cp -r lbar copy-lbar-recursive
, obtemos o seguinte:
foo
|-- bar
|-- copy-lbar
|-- copy-lbar-recursive -> bar
|-- lbar -> bar
Agora, assim como lbar
, copy-lbar-recursive
representa um link para o bar
arquivo original.
Mas por que existe a -r, --recursive
opção de cp
alterar a forma como os links são copiados?
O help
e manual
de cp
ambos apenas sinaliza como"copiar diretórios recursivamente".
O que acontece internamente que -r
tem efeito diferente em um link simbólico?
Responder1
O cheioDocumentação GNU(mas não a página de manual do Debian, por exemplo), descreve o comportamento da seguinte forma
Ao copiar de um link simbólico, cp normalmente segue o link apenas quando não está copiando recursivamente ou quando
--link
(-l
) é usado. Este padrão pode ser substituído pelas opções--archive
(-a
),-d
,--dereference
(-L
),--no-dereference
(-P
) e-H
.
Também escreve,
'
--recursive
' Copia diretórios recursivamente. Por padrão, não siga links simbólicos na fonte, a menos que seja usado junto com a opção--link
(-l
) [...]
Não é portátil usar -r para copiar links simbólicos ou arquivos especiais. [...]
Além disso, não é portável usar -R para copiar links simbólicos, a menos que você também especifique -P, pois o POSIX permite implementações que desreferenciam links simbólicos por padrão.
Portanto, para responder diretamente à sua pergunta, o comportamento é descrito para manter um elemento de compatibilidade comportamental padrão com o POSIX.