cp vs. cp -r em links simbólicos

cp vs. cp -r em links simbólicos

Recentemente experimentei o comando cp e percebi o seguinte:
Vamos supor que temos uma pasta foocontendo o arquivo bare o link simbólico l-bar:

foo
|-- bar
|-- lbar -> bar

Ao copiar lbarcom 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-lbarnão está vinculado de forma alguma a barou 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-recursiverepresenta um link para o bararquivo original.

Mas por que existe a -r, --recursiveopção de cpalterar a forma como os links são copiados?
O helpe manualde cpambos apenas sinaliza como"copiar diretórios recursivamente".
O que acontece internamente que -rtem 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.

informação relacionada