Jak zobaczyć pełną ścieżkę dowiązania symbolicznego

128

Kiedy używam ls -la symlinkNamelub stat symlinkNamenie jest wyświetlana cała ścieżka (np. ../../../one/two/file.txt)

Jakie polecenie systemu Linux ujawnia pełną ścieżkę?

15412s
źródło
4
Należy tutaj uważać: gdy ls lub stat nie wyświetlają żadnej ścieżki bezwzględnej - link nie ma ścieżki bezwzględnej! To jest esp. ważne, gdy urządzenie jest zamontowane np. w innym kontekście (np. jeśli masz coś na płycie CD lub pendrive albo próbujesz odzyskać uszkodzony dysk twardy). Wszystkie wymienione rozwiązania (realpath, readlink,…) pokazują tylko ścieżkę bezwzględną w zamontowanym kontekście.
flolo

Odpowiedzi:

225

realpathnie jest dostępny we wszystkich wersjach Linuksa, ale readlinkpowinien.

readlink -f symlinkName

Powyższe powinno załatwić sprawę.

Alternatywnie, jeśli nie masz zainstalowanego żadnego z powyższych, możesz wykonać następujące czynności, jeśli masz zainstalowany Python 2.6 (lub nowszy)

python -c 'import os.path; print(os.path.realpath("symlinkName"))'
Ian Stapleton Cordasco
źródło
16
Jeśli używasz OSX, pomiń -fflagę, a to zadziała. tj.readlink symlinkName
Josh Davenport
6
na OSX pomijanie flagi -f daje tylko ścieżkę względną
timoxley,
2
To pytanie dotyczyło Linuksa, wszyscy.
Ian Stapleton Cordasco
27

realpath <path to the symlink file> powinien załatwić sprawę.

JosephH
źródło
man realpathpokazuje na dole, że jest częścią „GNU coreutils”, co, jestem prawie pewien, zawsze pojawia się na Ubuntu, więc nawet jeśli @IanStapletonCordasco mówi „ realpathnie jest dostępne we wszystkich wersjach Linuksa”, powinno być przynajmniej dostępne na wszystkich Uważam, że wersje Ubuntu i pochodnych Ubuntu.
Gabriel Staples
10

smaki unix -> ll symLinkName

OSX -> readlink symLinkName

Różnica polega na tym, że pierwszy sposób wyświetla ścieżkę dowiązania symbolicznego w migający sposób, a drugi sposób po prostu odbija go na konsoli.

Rupam
źródło
Pytanie dotyczyło pełnej / bezwzględnej ścieżki, a nie ścieżki względnej (../../file.txt). Obie te odpowiedzi podadzą ścieżkę względną.
wisbucky
3

Innym sposobem na wyświetlenie informacji jest statpolecenie, które pokaże więcej informacji. Polecenie stat ~/.sshna wyświetlaczu mojego komputera

File: ‘/home/sumon/.ssh’ -> ‘/home/sumon/ssh-keys/.ssh.personal’
  Size: 34          Blocks: 0          IO Block: 4096   symbolic link
Device: 801h/2049d  Inode: 25297409    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/   sumon)   Gid: ( 1000/   sumon)
Access: 2017-09-26 16:41:18.985423932 +0600
Modify: 2017-09-25 15:48:07.880104043 +0600
Change: 2017-09-25 15:48:07.880104043 +0600
 Birth: -

Mam nadzieję, że to może komuś pomóc.

Engr. Hasanuzzaman Sumon
źródło
1

Możesz użyć awkz systemwywołaniem, readlinkaby uzyskać odpowiednik lswyniku z pełnymi ścieżkami dowiązań symbolicznych. Na przykład:

ls | awk '{printf("%s ->", $1); system("readlink -f " $1)}'

Wyświetli np

thin_repair ->/home/user/workspace/boot/usr/bin/pdata_tools
thin_restore ->/home/user/workspace/boot/usr/bin/pdata_tools
thin_rmap ->/home/user/workspace/boot/usr/bin/pdata_tools
thin_trim ->/home/user/workspace/boot/usr/bin/pdata_tools
touch ->/home/user/workspace/boot/usr/bin/busybox
true ->/home/user/workspace/boot/usr/bin/busybox
user3467349
źródło
może to zrobić bez readlink; po prostu użyj ls -l. To również w ogóle nie działa, próbuje to zrobić na wszystkim w katalogu (bez dowiązań) i jeśli twój ls jest skonfigurowany do używania kolorów, awk całkowicie się zepsuje. po prostu użyjfind . -maxdepth 1 -type l -ls | awk '{print $11 "\t" $12 "\t" $13}'
Hashbrown