Urmărind întregul lanț de zale
cale reală
cale reală (1) vă oferă destinația absolută a unui link. Dar îți oferă doar final destinație, așa că dacă aveți un lanț de legături, acesta vă va arăta doar calea ultimului fișier/dosar real către care în cele din urmă indică lanțul.
Deci, în cazul tău, dacă ../../e/f/g/h
este fișier sau folder real, veți vedea calea absolută. Dar dacă una dintre componente este și o legătură simbolică, se va păstra recursiv până când rezolvă toate legăturile simbolice din cale.
readlink
Ai putea folosi, de asemenea readlink(1)
comanda cu steaguri -f sau -e, care vă va oferi un rezultat similar cu cale reală
.
-f, --canonicalize canonicalize urmând fiecare legătură simbolică în
fiecare componentă a numelui dat în mod recursiv;
toate, în afară de ultima componentă, trebuie să existe
-e, --canonicalize-existing canonicalize urmând fiecare link simbolic în
fiecare componentă a numelui dat în mod recursiv,
toate componentele trebuie să existe
Evitați să urmăriți întregul lanț de zale
Dacă am înțeles bine, nu doriți să urmați lanțul până la ultima componentă, ci să obțineți doar calea absolută a verigii reale. Este puțin urât, dar poți face ceva de genul:
LINK=./a/b/c/d
/usr/bin/realpath --no-symlinks „$(dirname ${LINK})/$(readlink ${LINK})”
Explicaţie:
$ dirname $LINK # dirname ./a/b/c/d
./a/b/c
$ readlink $LINK # readlink ./a/b/c/d
../../e/f/g/h
$ echo „$(dirname ${LINK})/$(readlink ${LINK})”
./a/b/c/../../e/f/g/h
$ /usr/bin/realpath --no-symlinks „$(dirname ${LINK})/$(readlink ${LINK})”
/home/a/e/f/g/h
Dacă doriți să vedeți doar linkul referitor la CWD, puteți adăuga argumentul --relative-to:
$ /usr/bin/realpath --no-symlinks --relative-to ./ „$(dirname ${LINK})/$(readlink ${LINK})”
a/e/f/g/h
Folosind find
Puteți obține argumentul pentru comanda realpath pe care am arătat-o înainte utilizând comanda find:
$ find ./ -type l -printf „%h/%l\n”
./a/b/c/../../e/f/g/h
De la om găsi:
%h directoarele principale ale numelui fișierului (toate cu excepția ultimului element). Dacă
numele fișierului nu conține bare oblice (din moment ce este în versiunea curentă
directorul) specificatorul %h se extinde la „.”.
%l Obiect al legăturii simbolice (șir gol dacă fișierul nu este o legătură simbolică).
Apoi îl puteți combina cu comanda realpath de sus.
$ find ./ -type l -printf „%h/%l\n” | xargs /usr/bin/realpath -s
/home/a/e/f/g/h
Dacă doriți să vedeți doar linkul referitor la CWD:
$ find ./ -type l -printf „%h/%l\n” | xargs /usr/bin/realpath -s --relative-to ./
a/e/f/g/h