Biorąc pod uwagę ten przykład:
mkdir a
ln -s a b
ln -s b c
ln -s c d
Jeśli wykonam:
ls -l d
Pokaże:
d -> c
Czy istnieje sposób ls
lub inne polecenie linux, aby pokazać d -> c -> b -> a
zamiast tego?
linux
shell
symbolic-link
Kalecser
źródło
źródło
Odpowiedzi:
Po prostu użyj
namei
:źródło
ls
. Dzięki!readlink -e <link>
Uwaga: readlink a sam w sobie zwraca b
uwaga # 2: wraz z find -l narzędzie do listy łańcuchów może być łatwo napisane w perlu, ale musi być również wystarczająco inteligentne, aby wykrywać pętle
readlink nic nie wyświetli, jeśli masz pętlę. To chyba lepsze niż utknięcie.
źródło
brew install coreutils
igreadlink -e <link>
Oto funkcja rekurencyjna w Bash:
Na wielu liniach:
Przykłady:
Wymaga tego,
stat(1)
co może nie być obecne w niektórych systemach.Nie powiedzie się, jeśli nazwy zawierają znaki wsteczne, pojedyncze cudzysłowy lub „->”. Utknie w pętli z pętlami dowiązań symbolicznych (można to rozwiązać za pomocą tablicy asocjacyjnej w Bash 4). Eksportuje zmienną zwaną „łańcuchem” bez względu na to, czy jest już używana.
Mogą być z tym inne problemy.
Edytować:
Naprawiono problem z niektórymi względnymi dowiązaniami symbolicznymi. Niektóre nadal nie działają, ale wersja poniżej nie wymaga istnienia celu linku.
Dodano wersję, która wykorzystuje readlink:
źródło
readlink
wydaje mi się, że tego nie pokazuje. Java na Ubuntu to:/usr/bin/java -> /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
Możesz po prostu przetworzyć dane wyjściowe namei za pomocą czegoś podobnego
awk
lubgrep
uzyskać tylko potrzebne linie:lub
źródło