como atualizar um destino de link simbólico (ln -f -s não está funcionando)

45

estou a usar

ln -f -s / var / www / html / releases / build1390 app-current

para atualizar o link simbólico "app-current" com um novo destino. No entanto, isso não funciona, o link "app-current" mantém o destino original, no entanto, não recebo erros ...

Prefiro não remover o link e recriá-lo, basta atualizar o destino de um link existente. Isso é possível?

solsol
fonte

Respostas:

55

Isso funciona para mim, qual é o resultado strace ln -f -s /var/www/html/releases/build1390 app-current?

Ah, como é um diretório que você precisa adicionar -nsem nenhuma referência e isso deve resolver o problema. -fé realmente mais uma conveniência, pois adicionar o -f faz com que ele desvincule de qualquer maneira. Embora eu ache que isso provavelmente aconteceria algumas centenas de ms mais rápido em um sistema normalmente carregado.

Por exemplo, se o arf já aponta para / home:

strace Com -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace Sem -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Portanto, sem o -narf é desreferenciado, então o trata como se fosse realmente /. No seu exemplo em particular, se não houver erro, acho que você provavelmente criou um novo link simbólico /var/www/html/releases/build1390 app-currente desejará limpá-lo.

Kyle Brandt
fonte
4
ótimo, é o -n que fez isso. Muito obrigado!
Solsol 06/06/10
12

Você pode usar -nou --no-dereferenceimpedir que o destino seja desreferenciado, se for um link simbólico. Você também pode usar -Tou --no-target-directorypara garantir que o arquivo de destino sempre seja tratado como um arquivo regular.

Isso produz um comportamento ligeiramente diferente, como mostra o exemplo a seguir. Suponha que srchá algum arquivo, dirlinké um link simbólico para um diretório e diré um diretório real.

Usando -n:

  • ln -sfn src dirlinksubstitui dirlinke vincula-o asrc
  • ln -sfn src dir cria link dir/src -> src

Usando -T:

  • ln -sfT src dirlinksubstitui dirlinke vincula-o asrc
  • ln -sfT src dir produz uma mensagem de erro: ln: ‘dir’: cannot overwrite directory
augurar
fonte
1
tem a resposta mais correta e sucinta para usuários do Linux.
19413 ross
Existe alguma maneira de forçar a substituição do diretório de destino para que você não receba a mensagem de erro cannot overwrite directory?
Gitaarik
@rednaw Você pode fazer isso encadeando alguns comandos, mas lnele próprio não remove os diretórios - isso provavelmente seria uma má ideia, porque exigiria a remoção recursiva de um número possivelmente grande de arquivos.
21313 Aug Aug