Eu tenho um link simbólico sd/common.py -> actual_file
, e quero substituir o link por um arquivo gerado.
No entanto, sempre que faço
cp /tmp/Star_Wrangler/common.py sd/common.py
... ele copia /tmp/Star_Wrangler/common.py
e sobrescreve o actual_file
em vez de apenas substituir o link simbólico como pretendo. Toda vez que esqueço de deletar o link simbólico antes de copiar, isso continua acontecendo.
Existe uma opção para obter o comportamento que eu espero? Eu olho para os manuais, mas todos eles falam sobre links simbólicos na fonte, não no destino.
Isso depende de qual Unix você está usando.
Em alguns sistemas BSD (OpenBSD, FreeBSD), você descobrirá que
cp -f
desvinculará (removerá) o link simbólico e o substituirá pela fonte.Usando GNU
cp
, isso não teria o mesmo efeito e você precisaria usar a opção longa--remove-destination
.No macOS, use
cp -c
para, como diz o manual, "copiar arquivos usandoclonefile(2)
".No NetBSD, use
cp -a
("modo de arquivamento", o mesmocp -RpP
daquele sistema). Isso não funciona no GNU, macOS, OpenBSD ou FreeBSD, embora todos esses sistemas tenham a mesma-a
opção ou semelhante paracp
(em sistemas GNU, é o mesmo que-dR --preserve
).Você já mencionou isso: remover o link antes de copiar o arquivo resolverá o problema. O
rm
utilitário remove o link em vez do arquivo referenciado pelo link. Essa também é a maneira mais portátil de substituir um link simbólico por um arquivo comum.Se você estiver escrevendo um script, sugiro que use
rm
seguido porcp
.Se você estiver trabalhando interativamente e se esquecer de fazer isso, também é provável que se esqueça de usar uma opção específica com
cp
para essas situações.Os links simbólicos têm um comportamento muito confuso, não apenas com
cp
, mas tambémchmod
,chown
e o builtintest
(ou seu[ .. ]
alias), por exemplo.Remova o link simbólico primeiro (
rm -f sd/common.py
), depoiscp
.Claro, os vários
cp
's em vários sistemas têm várias opções para fazer isso, mas é muito fácil errar.Outra coisa que você pode fazer é evitar
cp
e apontar para um resultado de link simbólico.ln -sf SOURCE DESTINATION
(com ambos os argumentos sendo caminhos absolutos) funciona em todos os sistemas POSIX e não cria mais confusões.-f
remove qualquerDESTINATION
arquivo / link simbólico existente (mas não dir, infelizmente). Você pode combinar issorealpath
para evitar o problema do caminho relativo/absoluto: