2009-07-29 45 views
35

如何獲得bash中的任何給定路徑,並將其轉換爲規範形式,解引用可能包含在路徑中的任何符號鏈接?如何刪除bash中的符號鏈接?

例如:

~$ 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 

我怎樣才能得到的/tmp/symtest/foo/bar/cat完整規範的路徑(即:/tmp/symtest/cat)?

+0

謝謝你。我的搜查沒有發現這個問題。 – 2009-07-29 01:58:05

+0

不用擔心。我只知道要找它,因爲我問了它。 :) – 2009-07-29 01:58:33

回答

51

感謝Andy Skelton,看來答案是readlink -f

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

這裏,將解決符號鏈接的功能
它的初衷是爲了解決調用腳本 被指向的完整路徑在/ usr/bin中的符號連接

# 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 

它不使用遞歸,但後來我又從來沒有在bash

使用遞歸