2009-07-29 7 views
35

Làm cách nào tôi có thể thực hiện bất kỳ đường dẫn cụ thể nào trong số bash và chuyển đổi đường dẫn đó thành biểu mẫu chuẩn, bỏ qua bất kỳ liên kết tượng trưng nào có thể được chứa trong đường dẫn?Làm thế nào tôi có thể bãi bỏ các liên kết tượng trưng trong bash?

Ví dụ:

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

Làm thế nào tôi có thể nhận được con đường kinh điển đầy /tmp/symtest/foo/bar/cat (tức là: /tmp/symtest/cat)?

+0

Cảm ơn vì điều đó. Tìm kiếm của tôi-fu không tìm thấy câu hỏi đó. –

+0

Không phải lo lắng. Tôi chỉ biết tìm nó vì tôi hỏi. :) –

Trả lời

51

Nhờ Andy Skelton, dường như câu trả lời là readlink -f:

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

Dưới đây là một chức năng mà sẽ giải quyết liên kết tượng trưng
Đó là mục đích ban đầu là để giải quyết đầy đủ đường dẫn đến kịch bản gọi trỏ đến bởi một/usr/bin liên kết tượng trưng

# 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 

Nó không sử dụng đệ quy nhưng sau đó một lần nữa tôi chưa từng sử dụng đệ quy trong bash

01.
+4

Um, cái gì? Điều này là không cần thiết phức tạp, sao chép chức năng 'readlink -f' chuẩn mà không cần. Chưa kể câu trả lời đúng đã được đăng cách đây 3 năm ... – cha0site

+1

P.S. Xem câu trả lời SO này: http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac cho một giải pháp saner cho các hệ thống mà don không có 'readlink -f', chẳng hạn như Mac OS X. – cha0site