Dado este exemplo:
mkdir a
ln -s a b
ln -s b c
ln -s c d
Se eu executar:
ls -l d
Ele mostrará:
d -> c
Existe uma maneira ls
ou qualquer outro comando linux para mostrar d -> c -> b -> a
?
linux
shell
symbolic-link
Kalecser
fonte
fonte
Respostas:
Basta usar
namei
:fonte
ls
. Obrigado!readlink -e <link>
nota: o readlink a retorna por si só b
nota # 2: junto com o find -l, um utilitário para listar as cadeias pode ser facilmente escrito em perl, mas também precisa ser inteligente o suficiente para detectar loops
O readlink não produzirá nada se você tiver um loop. É melhor do que ficar preso, suponho.
fonte
brew install coreutils
egreadlink -e <link>
Aqui está uma função recursiva no Bash:
Em várias linhas:
Exemplos:
Requer o
stat(1)
que pode não estar presente em alguns sistemas.Ele falhará se os nomes contiverem backticks, aspas simples ou "->". Ele fica preso em um loop com loops de link simbólico (isso pode ser resolvido usando uma matriz associativa no Bash 4). Ele exporta uma variável chamada "cadeia" sem considerar se ela já está em uso.
Pode haver outros problemas com isso.
Editar:
Corrigido um problema com alguns links simbólicos relativos. Alguns ainda não funcionam, mas a versão abaixo não exige que o destino do link exista.
Adicionada uma versão que usa o readlink:
fonte
readlink
não parece mostrar isso. O Java no Ubuntu é:/usr/bin/java -> /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
Você pode apenas pós-processar a saída do namei com algo como
awk
ougrep
para obter apenas as linhas que deseja:ou
fonte