Como forçar a criação de um link simbólico?

4

Eu tenho um diretório particular cheio de outros diretórios organizados (nomeados) por data. Para facilitar a referência, eu tenho um link simbólico chamado current apontando para o mais recente.

No script que cria novos diretórios de data, desejo criar ou corrigir o link simbólico current para apontar para o diretório mais novo, uma vez criado.

Eu pensei que o comando apropriado seria apenas, por exemplo,

ln -fs 2017-03-01 current

Se o link simbólico current ainda não existir, isso funciona.

No entanto, se o link simbólico current já tiver sido criado (e apontar, digamos, no diretório 2017-02-28 ), isso não funcionará:

Em vez de remover o link simbólico current e criar um novo link simbólico current que aponta para 2017-03-01 , o resultado será um link simbólico quebrado chamado 2017-03-01 apontando para em si, descansando dentro do diretório 2017-02-28 (que é onde o link simbólico current apontou e ainda aponta).

Isso me deixou perplexo, então eu li as especificações de ln . Acontece que este é o comportamento esperado:

SYNOPSIS

ln [-fs] [-L|-P] source_file target_file

ln [-fs] [-L|-P] source_file... target_dir

DESCRIPTION

...

The second synopsis form shall be assumed when the final operand names an existing directory.

Parece, então, que não há nenhuma maneira de reenviar um symlink que atualmente aponta para um diretório para um novo alvo, onde o novo alvo tem um nome diferente do nome do symlink. Então, ln -fs não funciona da maneira que eu pensava.

Deve I rm current , ou existe outra abordagem que eu tenha negligenciado?

    
por Wildcard 02.03.2017 / 03:01

1 resposta

7

No ln do GNU, há ln -n , o que permitiria re-apontar um symlink:

$ mkdir dir1 dir2
$ ln -s dir1 sym
# dir1/
# dir2/
# sym -> dir1/

$ ln -nsf dir2 sym
# dir1/
# dir2/
# sym -> dir2/

O coreutils do BSD usa o sinalizador -h da mesma forma que -n seria usado, mas é provável que o binário suporte -n apenas para compatibilidade com o GNU .

    
por 02.03.2017 / 03:13

Tags