如何在bash中取消引用符号链接?

时间:2009-07-29 01:46:49

标签: bash symlink

如何在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)?

2 个答案:

答案 0 :(得分:56)

感谢Andy Skelton,答案似乎是readlink -f

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

答案 1 :(得分:-6)

这是一个可以解析符号链接的功能 它的最初目的是解析调用脚本的完整路径 由/ 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中使用递归