Como substituir / atualizar um link simbólico?

188

Estou tentando usar links simbólicos. Eu li e encontrei os seguintes comandos:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Criações e exclusões funcionam bem. Mas as atualizações não funcionam. Após executar este comando, o link simbólico se torna inválido.

Eu li aqui e ali que não é possível atualizar / substituir um link simbólico. Portanto, há informações contraditórias na rede. Quem está certo? Se um link simbólico pode ser atualizado / substituído, como posso fazer isso?

Atualizar

Aqui está a minha estrutura de diretórios:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

De ~/scripts/test/, quando eu executo:

ln -s /remote_loc/site1 test_link

a test_linké criado, e eu posso ls -l, mas parece quebrado (ao contrário do que eu disse acima na minha pergunta).

Como posso executar um link no nível de vários diretórios?

Jérôme Verstrynge
fonte
11
Eu recomendo usar em unlinkvez de rm. Com unlinkvocê nunca corre o risco de perder todos os arquivos em um diretório de origem acidentalmente usando chaves erradas.
Jpsy #
Você está usando um líder / em seu comando #
Jamie Cook
@jpsy, seu conselho sobre a desvinculação seria muito bom, se fosse verdade . Tente tocar em zzzz; desvincular zzzz. (desvincular chamadas, desvincular o mesmo que rm, mas sem opções sofisticadas e sem recursão).
Ctrl-alt-delor 16/10/16
Por que usar -n? (pode ser o problema). Além disso, se o seu ln suportar -t, use-o, nesses casos e -Tou destination/em outros casos.
Ctrl-alt-delor 16/10/16

Respostas:

150

Usar -fcom lnsubstituirá qualquer link que já estava lá, desde que você tenha as permissões corretas, ele deve funcionar ... Sempre funcionou para mim. Qual sistema operacional você está usando?

Sirch
fonte
Atualizei minha pergunta com mais informações sobre meu problema.
Jérôme Verstrynge
Estou sob linux.
Jérôme Verstrynge
2
Se você alternar os lnparâmetros, como estou propenso a fazer, o -fswitch destruirá seus arquivos existentes (destinos de link)? Nos dois casos, também temos o -iparâmetro (que solicitará a substituição do usuário), se você quiser um pouco de segurança.
palswim
2
@palswim Esta publicação do SO implica que é seguro, porque -fapenas chama unlink()e link()sob o capô: stackoverflow.com/a/1466570/157385 . Eu gostaria de lembrar a ordem correta, no entanto!
Mike Branski
4
Não funciona. Necessidades -n. Veja a resposta aceita.
Shawn Welch
119

Ok, descobri onde está o meu erro: não se deve colocar o primeiro /no caminho.

Em outras palavras, os comandos nas minhas perguntas devem ser:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

ao invés de

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

considerando o meu caso.

Jérôme Verstrynge
fonte
22
Para obter informações adicionais sobre o motivo, as diferenças são: um é um relativecaminho (sem o líder /) e o outro é um absolutecaminho (com o líder /). Se você estiver administrando um sistema Linux, é CRÍTICO entender as diferenças. Por exemplo, a diferença entre rm -rf ./*e rm -rf /.*decide se você manter o seu emprego ou não :)
Safado
5
Isso não responde à pergunta 'como atualizar / substituir um link sym'
Sirch
A linha ln -sfn {caminho / para / nome do arquivo} {nome do link} funciona.
Jérôme Verstrynge
6
-n (--no-dereference) faz com que ele trate o {link name} como um arquivo normal, em vez de seguir o link. Como você precisa operar nesse link e não segui-lo, você deve usar esta opção.
Feltroh 25/11
11
Esta resposta deve ser destaque resposta com -nparâmetro para substituir o link do símbolo.
Nick Tsai
12

Primeira edição:

Citando você:

Criações e exclusões funcionam bem. Mas as atualizações não funcionam. Após executar este comando, o link simbólico se torna inválido.

O problema com a estrutura de diretórios fornecida:

~ / scripts / test / ~ / scripts / test / remote_loc / ~ / scripts / test / remote_loc / site1 / ~ / scripts / test / remote_loc / site1 / stuff1.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts /test/remote_loc/site2/stuff2.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts / test / remote_loc / site3 / stuff3.txt

e usando o comando:

ln -s /remote_loc/site1 test_link

É que ele cria um link simbólico no seu $ PWD, ou diretório de trabalho atual, que aponta para um arquivo não existente fora do /, ou root, em / remote_loc / site1

Se o seu PWD estiver em ~ / scripts /, você deverá ter usado isso:

ln -s remote_loc/site1 test_link

caso contrário, você poderia ter usado o caminho absoluto completo como:

ln -s /home/yourusername/remote_loc/site1 test_link

Segunda questão:

Citando você:

Eu li aqui e ali que não é possível atualizar / substituir um link simbólico. Portanto, há informações contraditórias na rede. Quem está certo? Se um link simbólico pode ser atualizado / substituído, como posso fazer isso?

Para responder à sua pergunta "Quem está certo", não tenho certeza do que exatamente você leu ou como foi entendido. Mas, o seguinte deve ajudar a esclarecer:

  1. O que pode ser atualizado e
  2. O que não pode ser atualizado sem o uso de opções apropriadas.


Atualizando links simbólicos com destinos que não são diretórios.

ln -sf:
o -f ou --force remove os arquivos de destino existentes. É usado para atualizar o destino ou destino de um link.

Exemplo:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

Mas, como você pode ver, ele fornecerá o caminho absoluto se caminhos absolutos estiverem nos lnargumentos de. É necessário fornecer um caminho completo quando o diretório de trabalho atual for diferente do diretório pai do link.


Caminhos relativos:

ln -sfr:
o -r ou --relative cria links simbólicos em relação à localização do link.

Exemplo:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

Mas, atualizar um link para um diretório não funcionará se o destino for um diretório.

Exemplo:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

Como você pode ver, apesar de usar nomes de caminhos absolutos dados no lnargumento acima sem a opção -r, o link simbólico ainda é relativo ao link.


Atualizar links para diretórios:

ln -sfrn:
A opção -n ou --no-dereference trata LINK_NAME como um arquivo normal se for um link simbólico para um diretório.

Exemplo:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

Em contraste com:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir
Keith Reynolds
fonte
6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2
jirib
fonte
Quando executo testes com 1 nível de diretório, ele funciona, mas estou tentando usar diretórios de vários níveis e não funciona. Eu atualizei minha pergunta.
Jérôme Verstrynge