cd 到符号链接文件的目录

cd 到符号链接文件的目录

在我编写脚本之前,任何人都知道执行以下操作的简单方法:

$ pwd
/foo/bar
$ ls -l
lrwxr-xr-x  1 username  admin  48 Apr 17  2012 foo.sh -> /bar/foo.sh
$ cd /bar
$ ls
foo.sh

IE,在目录中/foo/bar,我想做类似cdl(cd link) 的操作,这会将我带到链接文件的目录(或者链接目录,如果碰巧是这种情况,如果是的话我可以输入cd -P /bar)。

答案1

在zsh中,有一个修饰语为此,或者更确切地说有两个:A解决符号链接(与真实路径)并h提取“头部”(即dirname)。

cd $file(:A:h)

只有当符号没有被破坏时这才有效。如果存在符号链接链,则遵循它直到最终目标。如果通过符号链接到达该目录,您将位于其目标中(与 一样cd -P)。


没有 zsh,如果您有该readlink实用程序,并且您想要更改到包含符号链接目标的目录:

cd -- "$(dirname -- "$(readlink -- "$file")")"

链接的目标本身可以是符号链接。如果你想切换到包含链接最终目标的目录,可以readlink循环调用:

while [ -L "$file" ]; do
  target=$(readlink -- "$file")
  while case $target in */) target=${target%/};; *) false;; esac; done
  case $target in
    */*) cd -- "${target%/*}"; target=${target#**/};;
  esac
done

在 Linux 上,假设符号链接没有损坏,您可以使用readlink -f规范化路径:

t=$(readlink -f -- "$file")
cd "${t%/*}"

答案2

您可以使用readlink解析符号链接,然后dirname获取其目录。

cdl () {
    cd "$(dirname "$(readlink "$1")")"; 
}
bash-3.2$ pwd
/foo/bar
bash-3.2$ ls -l
total 8
lrwxr-xr-x  1 root  wheel  11 Jun 15 19:10 foo.sh -> /bar/foo.sh
bash-3.2$ cdl foo.sh 
bash-3.2$ pwd 
/bar
bash-3.2$ 

答案3

一条线:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))

相关内容