Учитывая этот пример:
mkdir a
ln -s a b
ln -s b c
ln -s c d
Если я выполню:
ls -l d
Это покажет:
d -> c
Есть ли способ ls
или любая другая команда Linux, чтобы показать d -> c -> b -> a
вместо этого?
linux
shell
symbolic-link
Kalecser
источник
источник
Ответы:
Просто используйте
namei
:источник
ls
. Благодарность!readlink -e <link>
примечание: readlink a само по себе возвращает b
примечание # 2: вместе с find -l утилита для перечисления цепочек может быть легко написана на perl, но также должна быть достаточно умной для обнаружения циклов
readlink не будет ничего выводить, если у вас есть цикл. Полагаю, это лучше, чем застрять.
источник
brew install coreutils
иgreadlink -e <link>
Вот рекурсивная функция в Bash:
На нескольких строках:
Примеры:
Требуется,
stat(1)
что может не присутствовать в некоторых системах.Это не удастся, если имена содержат обратные кавычки, одинарные кавычки или "->". Он застревает в цикле с циклами символических ссылок (это можно решить с помощью ассоциативного массива в Bash 4). Он экспортирует переменную под названием «цепочка», независимо от того, используется ли она уже.
Могут быть другие проблемы с этим.
Редактировать:
Исправлена проблема с некоторыми относительными символическими ссылками. Некоторые все еще не работают, но версия ниже не требует, чтобы цель ссылки существовала.
Добавлена версия, которая использует readlink:
источник
readlink
, похоже , это не показывает. Java на Ubuntu - это:/usr/bin/java -> /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
Вы можете просто обработать вывод namei чем-то вроде
awk
илиgrep
получить строки, которые вы хотите:или
источник