ln: cria um symlink usando outro symlink

5

Suponhamos que eu tenha um arquivo e um diretório:

$ ls -l
total 4
drwxrwxr-x. 2 user user 4096 Oct  8 09:53 dir
-rw-rw-r--. 1 user user    0 Oct  8 09:53 file

Eu criei um symlink para file chamado symlink1 e um link simbólico para dir chamado dirslink1 :

$ ls -l
drwxrwxr-x. 2 user user 4096 Oct  8 09:53 dir
lrwxrwxrwx. 1 user user    3 Oct  8 10:03 dirslink1 -> dir
-rw-rw-r--. 5 user user    0 Oct  8 09:53 file
lrwxrwxrwx. 1 user user    4 Oct  8 09:53 symlink1 -> file

Agora criei links simbólicos para symlink1 usando ln -s e ln -sL :

$ ln -s symlink1 symlink2
$ ln -sL symlink1 symlink3
$ ln -s dirslink1 dirslink2
$ ln -sL dirslink1 dirslink3

Agora, tanto quanto eu entendo, symlink3 deve apontar para file e dirslink3 deve apontar para dir . Mas quando eu verifico, nenhum dos symlink[23] e dirslink[23] aponta para o arquivo ou diretório original:

$ ls -l
drwxrwxr-x. 2 user user 4096 Oct  8 09:53 dir
lrwxrwxrwx. 1 user user    3 Oct  8 10:03 dirslink1 -> dir
lrwxrwxrwx. 1 user user    9 Oct  8 10:03 dirslink2 -> dirslink1
lrwxrwxrwx. 1 user user    9 Oct  8 10:03 dirslink3 -> dirslink1
-rw-rw-r--. 5 user user    0 Oct  8 09:53 file
lrwxrwxrwx. 1 user user    4 Oct  8 09:53 symlink1 -> file
lrwxrwxrwx. 1 user user    8 Oct  8 09:54 symlink2 -> symlink1
lrwxrwxrwx. 1 user user    8 Oct  8 09:54 symlink3 -> symlink1

A pergunta é: É possível / Como eu crio um symlink para o arquivo original usando outro symlink?

    
por mrc02_kr 08.10.2018 / 10:39

2 respostas

10

-L só funciona com links físicos; como especificado em POSIX :

If the -s option is specified, the -L and -P options shall be silently ignored.

Se você tem readlink , pode usar isso:

ln -s -- "$(readlink symlink1)" symlink4

Se o seu readlink suportar a opção -f , você poderá usá-lo para canonizar totalmente o alvo ( ie resolver todos os links simbólicos no caminho do alvo, se o link simbólico incluir outros links simbólicos).

    
por 08.10.2018 / 10:48
5

Você pode usar cp -P para fazer uma cópia de um link simbólico:

cp -P symlink2 symlink3

(assumindo que symlink3 ainda não existe como diretório ou link simbólico para o diretório, veja a opção -T com o GNU cp para esses casos).

Tenha em atenção que, se o alvo da ligação simbólica for relativo, o que precede provavelmente resultaria num link quebrado se a cópia não estiver no mesmo diretório que a original.

com zsh ,

ln -s -- symlink2(:P) symlink3

Criaria symlink3 como um link simbólico para o caminho canônico completo (livre de links simbólicos) de symlink2 , como ln -s -- "$(readlink -f symlink2)" symlink3 , mas mais confiável porque ainda funcionaria corretamente se esse caminho terminasse em caracteres de nova linha.

A mesma ressalva acima e o mesmo trabalho com o GNU ln .

    
por 08.10.2018 / 10:54

Tags