cd 到符号链接文件的目录

Cha*_*ett 7 shell zsh cd-command symlink

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

$ 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
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*il' 8

在 zsh 中,有一个修饰符,或者更确切地说是两个:A解析符号链接(使用realpath)和h提取“头部”(即dirname)。

cd $file(:A:h)
Run Code Online (Sandbox Code Playgroud)

这仅在符号未损坏时才有效。如果存在符号链接链,则一直跟踪到最终目标。如果该目录是通过符号链接访问的,您将进入其目标(与 一样cd -P)。


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

cd -- "$(dirname -- "$(readlink -- "$file")")"
Run Code Online (Sandbox Code Playgroud)

链接的目标本身可能是一个符号链接。如果要切换到包含链接最终目标的目录,可以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
Run Code Online (Sandbox Code Playgroud)

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

t=$(readlink -f -- "$file")
cd "${t%/*}"
Run Code Online (Sandbox Code Playgroud)


Kev*_*vin 7

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

cdl () {
    cd "$(dirname "$(readlink "$1")")"; 
}
Run Code Online (Sandbox Code Playgroud)
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$ 
Run Code Online (Sandbox Code Playgroud)