Descubra o destino do link simbólico via linha de comando

107

Digamos que eu configure um link simbólico:

ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt

existe uma maneira de ver qual o destino de myothertextfile.txt está usando a linha de comando?

    
por Jared 19.10.2009 / 20:36

7 respostas

144

Use o sinalizador -f para imprimir a versão canonicalizada. Por exemplo:

readlink -f /root/Public/myothertextfile.txt

De man readlink :

-f, --canonicalize
      canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
    
por 19.10.2009 / 20:42
19

readlink é o comando que você deseja. Você deve olhar a man page do comando. Porque se você quiser seguir uma cadeia de links simbólicos para o arquivo atual, então você precisa da opção -e ou -f:

$ ln -s foooooo zipzip   # fooooo doesn't actually exist
$ ln -s zipzip zapzap

$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo

$ # Follows it, but file not there
$ readlink -e zapzap

$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip
    
por 19.10.2009 / 21:03
4

Isso também funcionará:

ls -l /root/Public/myothertextfile.txt

mas readlink seria preferido para uso em um script em vez de analisar ls .

    
por 19.10.2009 / 21:02
4

Se você quiser mostrar a origem e o destino do link, tente stat -c%N files* . Por exemplo,

$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’

Não é bom analisar (use readlink para isso), mas mostra o nome e o destino do link, sem a desordem de ls -l

-c pode ser escrito --format e %N significa “nome do arquivo entre aspas com desreferência se link simbólico”.

    
por 29.09.2015 / 19:44
2

O readlink é uma coisa boa, mas a plataforma específica e não cruzada do GNU. Eu costumava escrever scripts de plataforma cruzada para /bin/sh , portanto, eu usaria algo como:

 ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'

ou:

 ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'

mas estes precisam ser testados em diferentes plataformas. Eu acho que eles vão funcionar, mas não tenha 100% de certeza para o formato de saída ls .

    
por 17.04.2016 / 23:35
1

Se você não pode usar readlink , então, analisar o resultado de ls -l pode ser feito assim.

O resultado normal seria:

ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan  1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt

Portanto, queremos substituir tudo antes de "- >" e a seta incluída. Poderíamos usar sed para isso:

ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt
    
por 02.09.2015 / 10:25
0

ll ou ls -l deve listar os itens do diretório, incluindo seu link simbólico e seu destino

cd -P /root/Public/myothertextfile.txt (no seu caso) deve apontar para o caminho original

    
por 02.05.2018 / 15:48