2009-07-29 33 views
35

Jak mogę wziąć dowolną ścieżkę w bash i przekonwertować ją do jej formy kanonicznej, dereferencji wszelkich dowiązań symbolicznych, które mogą znajdować się w ścieżce?Jak mogę usunąć dowiązania symboliczne w bashu?

Na przykład:

~$ mkdir /tmp/symtest 
~$ cd /tmp/symtest/ 
/tmp/symtest$ mkdir -p foo/bar cat/dog 
/tmp/symtest$ cd foo/bar/ 
/tmp/symtest/foo/bar$ ln -s ../../cat cat 
/tmp/symtest/foo/bat$ cd ../../ 
/tmp/symtest$ tree 
. 
|-- cat 
| `-- dog 
`-- foo 
    `-- bar 
     `-- cat -> ../../cat 

6 directories, 0 files 

Jak mogę uzyskać pełną ścieżkę /tmp/symtest/foo/bar/cat kanonicznej (tj: /tmp/symtest/cat)?

+0

Dzięki za to. Moja wyszukiwarka nie znalazła tego pytania. –

+0

Bez obaw. Wiedziałem tylko, żeby go szukać, ponieważ go o to poprosiłem. :) –

Odpowiedz

51

Dzięki Andy Skelton, wydaje się, że odpowiedź jest readlink -f:

$:/tmp/symtest$ readlink -f /tmp/symtest/foo/bar/cat 
/tmp/symtest/cat 
-5

Oto funkcja, która będzie rozwiązać dowiązania symboliczne
To Pierwotnym celem jest rozwiązanie pełną ścieżkę do skryptu wywołującego wskazywanym przez/usr/bin symlink

# resolve symbolic links 
function resolve_link() { 
    local LINK_FILE=${1:-${BASH_SOURCE[0]}} 
    local FILE_TYPE=`file $LINK_FILE | awk '{print $2}'` 
    local LINK_TO=$LINK_FILE 
    while [ $FILE_TYPE = "symbolic" ]; do 
    LINK_TO=`readlink $LINK_FILE` 
    FILE_TYPE=`file $LINK_TO | awk '{print $2}'` 
    done 
    echo $LINK_TO 
} 

BASH_SOURCE_RESOLVED=$(resolve_link) 
echo $BASH_SOURCE_RESOLVED 

nie używa rekursji, ale potem znowu nigdy nie używałem rekursji w bash

+4

Um, co? Jest to niepotrzebnie skomplikowane, replikując standardową funkcjonalność 'readlink -f' bez potrzeby. Nie wspominając o tym, że poprawna odpowiedź została wysłana 3 lata temu ... – cha0site

+1

P.S. Zobacz tę odpowiedź: http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac, aby uzyskać prostsze rozwiązanie dla systemów 't mają 'readlink -f', takie jak Mac OS X. – cha0site

Powiązane problemy